RabbitMQ

Брокер сообщений: принимает сообщения от одних программ, хранит в очередях и надежно доставляет другим, даже если получатель временно недоступен.

RabbitMQ — брокер сообщений с открытым исходным кодом, впервые выпущенный в 2007 году. Он работает как почтовое отделение между программами: одна система оставляет сообщение, брокер кладет его в очередь, а другая система забирает его, когда готова. Отправителю не нужно ждать получателя и даже знать, кто именно обработает сообщение. RabbitMQ написан на языке Erlang и основан на протоколе AMQP.

Как устроен

  • Производитель (producer) публикует сообщение — например, «заказ 1042 оплачен».
  • Обменник (exchange) решает, в какие очереди его отправить: в одну конкретную (direct), во все подписанные (fanout) или в те, что подходят по шаблону ключа (topic).
  • Очередь хранит сообщения, пока их не заберут, — это та самая структура «первым пришел, первым ушел» из термина «Структуры данных».
  • Потребитель (consumer) забирает сообщение, обрабатывает и подтверждает. Без подтверждения брокер отдаст сообщение снова.

Пример

Сервис заказов публикует событие «заказ оплачен». Обменник рассылает его в три очереди: сервису уведомлений (отправить письмо клиенту), бухгалтерии (сформировать документы) и складу (собрать заказ). Каждый получатель работает в своем темпе. Если бухгалтерская система на час остановится на обновление, ее сообщения подождут в очереди — ни одно не потеряется, и сервис заказов об этом даже не узнает.

Зачем нужен брокер

  • Слабая связанность. Системы не вызывают друг друга напрямую, а значит, могут меняться и падать независимо. Это основа надежной микросервисной архитектуры.
  • Сглаживание пиков. Тысяча заявок за минуту не уронит обработчик — они встанут в очередь и обработаются по мере сил.
  • Фоновые задачи. Отправка писем, формирование отчетов и документов уходят из пользовательского запроса в очередь: интерфейс отвечает сразу.
  • Масштабирование. Если очередь растет, запускают больше обработчиков, и они делят работу.

Надежность

Чтобы сообщения переживали перезапуск, очереди и сообщения делают постоянными (durable). Сообщения, которые не удалось обработать после нескольких попыток, уходят в отдельную очередь «мертвых писем» — их разбирают вручную, а не теряют. Для отказоустойчивости брокер запускают кластером с реплицируемыми очередями.

RabbitMQ или Kafka

Apache Kafka тоже передает сообщения, но устроена иначе: это журнал событий, который хранит сообщения днями и позволяет перечитывать их заново. Kafka выбирают для потоков событий огромного объема и аналитики, RabbitMQ — для гибкой маршрутизации, задач и интеграций между системами, где важна гарантированная доставка каждого сообщения. Для простых очередей иногда хватает и Redis. Обмен через брокер — частая часть интеграций в разработке информационных систем, наряду с прямыми вызовами REST API.