Modalità di routing PHP RabbitMQ (Modalità diretta)

Nella modalità di routing di RabbitMQ, il tipo di exchange utilizzato è "direct". La differenza principale rispetto alla modalità di pubblicazione-sottoscrizione è che l'exchange diretta invia i messaggi alle code il cui criterio di routing è completamente corrispondente. L'architettura è come mostrato nel grafico seguente:

RabbitMQ Modalità diretta

Nota: Indipendentemente dalla modalità di lavoro utilizzata in RabbitMQ, la differenza risiede nel tipo di exchange utilizzato e nei criteri di routing.

1. Tutorial preparatorio

Si prega di leggere prima le seguenti sezioni per comprendere le conoscenze pertinenti:

2. Definire l'exchange diretta

// Dichiarare l'exchange
$channel->exchange_declare(
    'tizi365.direct', // Nome exchange univoco
    'direct', // Tipo di exchange
    false,
    false, // Se persistere
    false
);

Nota: Sia i produttori che i consumatori di messaggi hanno bisogno di un exchange.

3. Invio dei messaggi

Inviare i messaggi all'exchange e l'exchange invierà i messaggi alla coda corrispondente in base alle regole di routing.

<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

// Creare una connessione RabbitMQ
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// Creare un canale
$channel = $connection->channel();

// Dichiarare l'exchange
$channel->exchange_declare(
    'tizi365.direct', // Nome exchange univoco
    'direct', // Tipo di exchange
    false,
    false, // Se persistere
    false
);

// Oggetto messaggio, il contenuto del messaggio è il parametro
$msg = new AMQPMessage("ciao tizi365.com");

// Prestare attenzione al terzo parametro, criterio di routing
$channel->basic_publish(
    $msg, // Oggetto messaggio
    'tizi365.direct', // Nome exchange
    "tizi365" // Criterio di routing, può essere definito arbitrariamente secondo necessità
);

echo ' [x] Inviato ', $msg->getBody(), "\n";

// Rilascio delle risorse
$channel->close();
$connection->close();

Nota: Il terzo parametro nel metodo basic_publish è un parametro chiave.

4. Ricezione dei messaggi

4.1. Definire la Coda e Collegare lo Scambio

Per consumare i messaggi in coda, è necessario prima definire una coda e quindi collegarla allo scambio di destinazione.

// Dichiarare una coda anonima
list($queue_name, ,) = $channel->queue_declare("", false, false, true, false);

// Collegare la coda allo scambio specificato
$channel->queue_bind(
    $queue_name, // Nome della coda
    'tizi365.fanout', // Nome dello scambio
    "tizi365" // Parametro di routing di collegamento, qui si collega 'tizi365'
);

Nota: Secondo le regole dello scambio diretto, se il parametro di routing trasportato durante l'invio di un messaggio corrisponde al parametro di routing impostato durante il collegamento della coda allo scambio, il messaggio verrà consegnato a questa coda.

<?php

require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;

// Creare una connessione rabbitmq
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// Creare un canale
$channel = $connection->channel();

// Dichiarare uno scambio
$channel->exchange_declare(
    'tizi365.direct', // Nome dello scambio, deve essere unico e non può essere ripetuto
    'direct', // Tipo di scambio
    false,
    false, // Se è persistente
    false
);

// Dichiarare una coda anonima
list($queue_name, ,) = $channel->queue_declare("", false, false, true, false);

// Collegare la coda a uno scambio specifico
$channel->queue_bind(
    $queue_name, // Nome della coda
    'tizi365.fanout', // Nome dello scambio
    "tizi365" // Parametro di collegamento di routing, collega 'tizi365' qui
);

echo " [*] In attesa di messaggi. Premi CTRL+C per uscire\n";

// Definire la funzione di gestione dei messaggi (usando una funzione anonima qui)
$callback = function ($msg) {
    // Logica di gestione dei messaggi
    echo ' [x] ', $msg->body, "\n";
};

// Creare un consumatore
$channel->basic_consume(
    $queue_name, // Nome della coda, il nome della coda da consumare
    '', // Tag del consumatore, ignorato, viene generato automaticamente un ID univoco
    false,
    true, // Se riconoscere automaticamente il messaggio, ovvero informare automaticamente rabbitmq che il messaggio è stato elaborato con successo.
    false,
    false,
    $callback // Funzione di gestione dei messaggi
);

// Bloccare il processo finché il canale non è chiuso, per evitare che il processo esca
while ($channel->is_open()) {
    $channel->wait();
}

// Rilasciare le risorse
$channel->close();
$connection->close();