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:
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:
- Concetti di base di RabbitMQ
- Principi della modalità di routing di RabbitMQ
- Avvio rapido per PHP con RabbitMQ (necessario, poiché le sezioni successive non ripeteranno il codice, mostreranno solo il codice chiave)
- Sezione Modello di pubblicazione-sottoscrizione per PHP RabbitMQ (necessaria, poiché la struttura del codice è quasi la stessa, tranne per il tipo di exchange e i criteri di routing)
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();