RabbitMQ
Брокер сообщений: принимает сообщения от одних программ, хранит в очередях и надежно доставляет другим, даже если получатель временно недоступен.
RabbitMQ — брокер сообщений с открытым исходным кодом, впервые выпущенный в 2007 году. Он работает как почтовое отделение между программами: одна система оставляет сообщение, брокер кладет его в очередь, а другая система забирает его, когда готова. Отправителю не нужно ждать получателя и даже знать, кто именно обработает сообщение. RabbitMQ написан на языке Erlang и основан на протоколе AMQP.
Как устроен
- Производитель (producer) публикует сообщение — например, «заказ 1042 оплачен».
- Обменник (exchange) решает, в какие очереди его отправить: в одну конкретную (direct), во все подписанные (fanout) или в те, что подходят по шаблону ключа (topic).
- Очередь хранит сообщения, пока их не заберут, — это та самая структура «первым пришел, первым ушел» из термина «Структуры данных».
- Потребитель (consumer) забирает сообщение, обрабатывает и подтверждает. Без подтверждения брокер отдаст сообщение снова.
Пример
Сервис заказов публикует событие «заказ оплачен». Обменник рассылает его в три очереди: сервису уведомлений (отправить письмо клиенту), бухгалтерии (сформировать документы) и складу (собрать заказ). Каждый получатель работает в своем темпе. Если бухгалтерская система на час остановится на обновление, ее сообщения подождут в очереди — ни одно не потеряется, и сервис заказов об этом даже не узнает.
Зачем нужен брокер
- Слабая связанность. Системы не вызывают друг друга напрямую, а значит, могут меняться и падать независимо. Это основа надежной микросервисной архитектуры.
- Сглаживание пиков. Тысяча заявок за минуту не уронит обработчик — они встанут в очередь и обработаются по мере сил.
- Фоновые задачи. Отправка писем, формирование отчетов и документов уходят из пользовательского запроса в очередь: интерфейс отвечает сразу.
- Масштабирование. Если очередь растет, запускают больше обработчиков, и они делят работу.
Надежность
Чтобы сообщения переживали перезапуск, очереди и сообщения делают постоянными (durable). Сообщения, которые не удалось обработать после нескольких попыток, уходят в отдельную очередь «мертвых писем» — их разбирают вручную, а не теряют. Для отказоустойчивости брокер запускают кластером с реплицируемыми очередями.
RabbitMQ или Kafka
Apache Kafka тоже передает сообщения, но устроена иначе: это журнал событий, который хранит сообщения днями и позволяет перечитывать их заново. Kafka выбирают для потоков событий огромного объема и аналитики, RabbitMQ — для гибкой маршрутизации, задач и интеграций между системами, где важна гарантированная доставка каждого сообщения. Для простых очередей иногда хватает и Redis. Обмен через брокер — частая часть интеграций в разработке информационных систем, наряду с прямыми вызовами REST API.