Режим маршрутизации RabbitMQ (режим прямой маршрутизации)

В режиме маршрутизации RabbitMQ используется тип обмена "direct". Основное отличие от режима издатель-подписчик заключается в том, что обмен прямой доставляет сообщения в очереди, параметры маршрутизации которых полностью соответствуют. Архитектура показана на следующем графике:

Режим прямой маршрутизации RabbitMQ

Примечание: Независимо от используемого режима работы в RabbitMQ различие заключается в типе обмена и параметрах маршрутизации.

1. Подготовительное руководство

Пожалуйста, сначала прочитайте следующие разделы, чтобы понимать соответствующие знания:

2. Определение прямого обмена

// Объявляем обмен
$channel->exchange_declare(
    'tizi365.direct', // Уникальное имя обмена
    'direct', // Тип обмена
    false,
    false, // Хранить ли
    false
);

Примечание: Обмен необходим как для производителей сообщений, так и для потребителей.

3. Отправка сообщений

Мы отправляем сообщения в обмен, и обмен доставляет сообщения в соответствующую очередь на основе правил маршрутизации.

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

// Создаем соединение с RabbitMQ
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// Создаем канал
$channel = $connection->channel();

// Объявляем обмен
$channel->exchange_declare(
    'tizi365.direct', // Уникальное имя обмена
    'direct', // Тип обмена
    false,
    false, // Хранить ли
    false
);

// Объект сообщения, содержимое сообщения является параметром
$msg = new AMQPMessage("привет tizi365.com");

// Обратите внимание на третий параметр, параметр маршрутизации
$channel->basic_publish(
    $msg, // Объект сообщения
    'tizi365.direct', // Имя обмена
    "tizi365" // Параметр маршрутизации, может быть произвольно определен по мере необходимости
);

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

// Освобождаем ресурсы
$channel->close();
$connection->close();

Примечание: Третий параметр в методе basic_publish является ключевым параметром.

4. Получение сообщений

4.1. Определение Очереди и Привязка К Exchange

Для получения сообщений из очереди сначала необходимо определить очередь, а затем привязать ее к целевому обменнику.

// Объявление анонимной очереди
list($queue_name, ,) = $channel->queue_declare("", false, false, true, false);

// Привязка очереди к указанному обменнику
$channel->queue_bind(
    $queue_name, // Имя очереди
    'tizi365.fanout', // Имя обменника
    "tizi365" // Параметр маршрутизации для привязки, здесь привязывается 'tizi365'
);

Примечание: Согласно правилам прямого обмена, если параметр маршрутизации, переданный при отправке сообщения, соответствует параметру маршрутизации, установленному при привязке очереди к обменнику, сообщение будет доставлено в эту очередь.