Ответ
RabbitMQ — это открытый брокер сообщений, реализующий протокол AMQP (Advanced Message Queuing Protocol). Он выступает в роли промежуточного слоя (message broker), который принимает, маршрутизирует, хранит и доставляет сообщения между независимыми приложениями или сервисами.
Основная роль — обеспечение надежного асинхронного взаимодействия в распределенных системах.
Ключевые компоненты архитектуры RabbitMQ:
- Producer (Издатель): Приложение, которое отправляет сообщения.
- Exchange (Обменник): Принимает сообщения от продюсера и решает, в какие очереди их направить. Типы обменников определяют логику маршрутизации:
- Direct: Сообщение идет в очередь, чей
routing keyточно совпадает с ключом сообщения. - Fanout: Сообщение рассылается во все привязанные очереди (broadcast).
- Topic: Гибкая маршрутизация по шаблону
routing key(например,logs.*.error). - Headers: Маршрутизация на основе заголовков сообщения, а не ключа.
- Direct: Сообщение идет в очередь, чей
- Queue (Очередь): Буфер, хранящий сообщения до их обработки.
- Consumer (Потребитель): Приложение, которое получает и обрабатывает сообщения из очереди.
Пример на PHP с библиотекой php-amqplib:
Отправка сообщения (Producer):
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLibConnectionAMQPStreamConnection;
use PhpAmqpLibMessageAMQPMessage;
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();
// Объявляем обменник типа 'direct'
$channel->exchange_declare('order_events', 'direct', false, true, false);
// Объявляем очередь
$channel->queue_declare('email_queue', false, true, false, false);
// Привязываем очередь к обменнику с ключом 'order.created'
$channel->queue_bind('email_queue', 'order_events', 'order.created');
$messageBody = json_encode(['order_id' => 789, 'user_email' => 'user@example.com']);
$msg = new AMQPMessage($messageBody, ['delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT]);
// Публикуем сообщение в обменник с ключом маршрутизации
$channel->basic_publish($msg, 'order_events', 'order.created');
$channel->close();
$connection->close();
Получение сообщения (Consumer):
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLibConnectionAMQPStreamConnection;
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
$channel = $connection->channel();
$callback = function (AMQPMessage $msg) {
$data = json_decode($msg->body, true);
echo " [x] Received order #" . $data['order_id'] . " for email " . $data['user_email'] . "n";
// Здесь логика отправки email...
$msg->ack(); // Подтверждаем успешную обработку
};
// Указываем, что за раз потребитель берет одно сообение
$channel->basic_qos(null, 1, null);
// Начинаем потребление с ручным подтверждением (ack)
$channel->basic_consume('email_queue', '', false, false, false, false, $callback);
while ($channel->is_consuming()) {
$channel->wait();
}
Преимущества использования RabbitMQ в архитектуре:
- Развязка сервисов: Продюсеры и потребители не знают друг о друге, что упрощает разработку и развертывание.
- Гарантированная доставка: Сообщения могут быть сохранены на диск, чтобы пережить перезапуск брокера.
- Гибкая маршрутизация: Разные типы обменников позволяют реализовать сложные сценарии (работа, публикация событий).
- Балансировка нагрузки: Несколько потребителей на одной очереди автоматически распределяют нагрузку (конкурентное потребление).
- Отказоустойчивость: Поддержка кластеризации и зеркалирования очередей.
Типичные сценарии использования: фоновая обработка задач (отправка email, генерация отчетов), интеграция микросервисов, буферизация запросов при пиковых нагрузках.