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.

Mode de travail RabbitMQ

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 :

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
);