Режим маршрутизации RabbitMQ (режим прямой маршрутизации)
В режиме маршрутизации RabbitMQ используется тип обмена "direct". Основное отличие от режима издатель-подписчик заключается в том, что обмен прямой доставляет сообщения в очереди, параметры маршрутизации которых полностью соответствуют. Архитектура показана на следующем графике:
Примечание: Независимо от используемого режима работы в RabbitMQ различие заключается в типе обмена и параметрах маршрутизации.
1. Подготовительное руководство
Пожалуйста, сначала прочитайте следующие разделы, чтобы понимать соответствующие знания:
- Основные концепции RabbitMQ
- Принципы режима маршрутизации RabbitMQ
- Быстрый старт для PHP с RabbitMQ (обязательно, так как последующие разделы не будут повторять код, а только отображать ключевой код)
- Раздел шаблона издатель-подписчик для PHP с RabbitMQ (обязательно, так как структура кода практически одинакова, за исключением типа обмена и параметров маршрутизации)
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'
);
Примечание: Согласно правилам прямого обмена, если параметр маршрутизации, переданный при отправке сообщения, соответствует параметру маршрутизации, установленному при привязке очереди к обменнику, сообщение будет доставлено в эту очередь.