Открыть сервис

Брокер очередей RabbitMQ

RabbitMQ — это программный брокер сообщений, реализующий протокол AMQP (Advanced Message Queuing Protocol). Он предназначен для организации асинхронного обмена данными между различными компонентами распределённых систем, выступая в роли посредника между отправителями (продюсерами) и получателями (консюмерами) сообщений. RabbitMQ обеспечивает надёжную доставку сообщений, маршрутизацию на основе правил и поддержку различных схем обмена, что делает его одним из наиболее распространённых решений в области микросервисной архитектуры и систем, ориентированных на обработку событий.

История

Разработка RabbitMQ была начата в 2007 году компанией LShift, а затем продолжена совместно с компанией CohesiveFT. Первоначально проект создавался как реализация протокола AMQP 0-9-1, который на тот момент находился в стадии разработки. В 2010 году RabbitMQ был передан под управление компании VMware (ныне часть корпорации Broadcom), которая приобрела SpringSource, владевшую RabbitMQ. Позднее проект стал частью экосистемы Pivotal Software, а с 2019 года — подразделения VMware.

В 2013 году была выпущена версия 3.0, которая включала поддержку плагинов, кластеризации и улучшенную производительность. В 2018 году RabbitMQ был включён в состав облачной платформы Pivotal Cloud Foundry. На протяжении всего существования проект остаётся открытым и распространяется под лицензией Mozilla Public License (MPL) 2.0. Основной язык реализации — Erlang, что обеспечивает высокую отказоустойчивость и масштабируемость.

Архитектура и основные компоненты

Модель обмена сообщениями

RabbitMQ работает по модели «продюсер — брокер — консюмер». Продюсер отправляет сообщение в брокер, который хранит его в очереди и передаёт одному или нескольким консюмерам. В отличие от прямого соединения, такая схема позволяет развязать по времени и нагрузке компоненты системы: продюсер может отправлять сообщения, не дожидаясь готовности консюмера, и наоборот.

Обменники (Exchanges)

Ключевым элементом маршрутизации в RabbitMQ является обменник (exchange). Продюсер отправляет сообщение не напрямую в очередь, а на обменник, который на основе заданных правил (типа обменника и ключа маршрутизации) направляет сообщение в одну или несколько очередей. RabbitMQ поддерживает несколько типов обменников:

Очереди (Queues)

Очереди хранят сообщения до тех пор, пока они не будут обработаны консюмерами. Каждая очередь имеет имя и может быть настроена на различные параметры: долговечность (durable — сохраняется после перезапуска брокера), автоматическое удаление (auto-delete — удаляется после отключения последнего консюмера), ограничение длины и времени жизни сообщений (TTL). Очереди могут быть связаны с одним или несколькими обменниками через привязки (bindings).

Сообщения (Messages)

Сообщение в RabbitMQ состоит из заголовков (метаданных) и тела (полезной нагрузки). Тело обычно содержит данные в формате JSON, XML, бинарном виде или другом сериализованном формате. Сообщение может быть помечено как persistent (постоянное) — в этом случае оно записывается на диск, что гарантирует его сохранность при сбое брокера. Непостоянные сообщения хранятся только в оперативной памяти и теряются при перезапуске.

Подтверждения (Acknowledgments)

Для обеспечения надёжной доставки RabbitMQ использует механизм подтверждений. Консюмер после успешной обработки сообщения отправляет брокеру сигнал ack. Если консюмер не отправляет подтверждение в течение заданного тайм-аута или разрывает соединение, сообщение повторно ставится в очередь и может быть передано другому консюмеру. Это предотвращает потерю сообщений при сбоях потребителя.

Кластеризация и высокая доступность

RabbitMQ поддерживает объединение нескольких узлов в кластер. В кластерной конфигурации очереди, обменники и привязки реплицируются между узлами, что обеспечивает отказоустойчивость. Однако по умолчанию данные очередей (сообщения) хранятся только на одном узле. Для обеспечения высокой доступности (HA) используется механизм quorum queues (кворумные очереди) или mirrored queues (зеркальные очереди, устаревший механизм).

Кворумные очереди, введённые в RabbitMQ 3.8, реплицируют данные на несколько узлов кластера и используют протокол консенсуса Raft. Это обеспечивает согласованность данных и автоматическое восстановление после отказа узла. При выходе из строя одного из узлов кворумная очередь продолжает работу, а данные не теряются.

Протоколы и плагины

Поддерживаемые протоколы

Хотя RabbitMQ изначально разрабатывался для AMQP 0-9-1, он поддерживает и другие протоколы обмена сообщениями через плагины:

Плагины

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

Применение

RabbitMQ широко используется в корпоративных и облачных системах для решения следующих задач:

Преимущества и недостатки

Преимущества

Недостатки

Сравнение с другими брокерами

RabbitMQ часто сравнивают с Apache Kafka, ActiveMQ и Amazon SQS. Ключевые отличия:

Безопасность

RabbitMQ поддерживает несколько механизмов аутентификации и авторизации:

Интересные факты

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →