Modèle de publication/abonnement RabbitMQ (également connu sous le nom de modèle de ventilation)
Le mode de ventilation (Fanout) dans RabbitMQ est un modèle dans lequel les messages envoyés par un producteur sont traités par plusieurs consommateurs dans des files d'attente différentes, comme illustré dans le schéma d'architecture ci-dessous.
L'échange de ventilation peut transmettre des messages à toutes les files d'attente liées.
Remarque : Peu importe le mode de travail de RabbitMQ utilisé, la différence réside dans le type d'échange et les paramètres de routage utilisés.
1. Tutoriel préalable
Veuillez lire les chapitres suivants pour comprendre les connaissances pertinentes :
- Principes de base de RabbitMQ
- Modèle de publication/abonnement RabbitMQ
- Démarrage rapide de RabbitMQ en PHP (Obligatoire, car les chapitres suivants ne répéteront pas le code mais montreront uniquement des extraits de code clés)
2. Définition d'un échange de ventilation
Définissez l'échange via la fonction exchange_declare du canal.
$channel->exchange_declare(
'tizi365.fanout', // Nom de l'échange, doit être unique et ne peut pas être dupliqué
'fanout', // Type d'échange
false,
false, // Si persistant
false
);
Remarque : L'échange est requis à la fois pour les producteurs de messages et les consommateurs.
3. Envoi de messages
Nous envoyons des messages à l'échange, et l'échange délivre les messages aux files d'attente correspondantes en fonction des règles de routage.
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
// Créer une connexion RabbitMQ
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// Créer un canal
$channel = $connection->channel();
// Déclarer l'échange
$channel->exchange_declare(
'tizi365.fanout', // Nom de l'échange, doit être unique et ne peut pas être dupliqué
'fanout', // Type d'échange
false,
false, // Si persistant
false
);
// Objet message, avec le contenu du message comme paramètre
$msg = new AMQPMessage("bonjour tizi365.com");
$channel->basic_publish(
$msg, // Objet message
'tizi365.fanout' // Nom de l'échange
);
echo ' [x] Envoyé ', $msg->getBody(), "\n";
// Libérer les ressources
$channel->close();
$connection->close();
4. Réception de messages
4.1. Définition d'une file d'attente et liaison à l'échange
Pour consommer des messages de la file d'attente, vous devez d'abord définir une file d'attente, puis la lier à l'échange cible. Ci-dessous, une file d'attente est définie et liée à un échange spécifique.
// Déclare une file d'attente, si le nom de la file d'attente est vide, un ID unique est généré automatiquement et le nom de la file d'attente est renvoyé
list($queue_name, ,) = $channel->queue_declare(
"", // Nom de la file d'attente, ne peut pas être dupliqué, si vide, un ID unique est généré automatiquement, en faisant de celle-ci une file d'attente anonyme
false,
false, // Indique s'il faut persister
true,
false
);
// Lie la file d'attente à l'échange spécifié
$channel->queue_bind(
$queue_name, // Nom de la file d'attente
'tizi365.fanout' // Nom de l'échange
);