RabbitMQ — распределенная очередь сообщений с открытым исходным кодом, поддерживающая множество протоколов связи. Это брокер сообщений, который получает сообщения от Producer (поставщик) и пересылает их Consumer (подписчик).
Эти сообщения хранятся в очереди. Queue (очередь) — это буфер сообщений, построенный по принципу «первым пришел — первым обслужен» (FIFO). Многие поставщики могут отправлять сообщения в очереди, а подписчики могут получать сообщения из этих очередей.
Архитектура RabbitMQ и основные компоненты
RabbitMQ состоит из следующих основных частей:
- Producer (поставщик) — приложение или служба, которая публикует сообщение на сервер RabbitMQ.
- Exchange — действует как фильтр сообщений. Он получает сообщения от поставщика и публикует их в очередях, используя правила маршрутизации для отправки их подписчику.
- Queue — очередь RabbitMQ, в которой хранятся опубликованные сообщения (ожидающие отправки подписчику ).
- Consumer (подписчик) — приложение или служба, считывающая сообщения из очереди сервера RabbitMQ.
Вот простой сценарий, когда пользователь отправляет запрос (сообщение) на создание веб-приложения PDF.
Обмен происходит с помощью сообщений:
Сообщение — это данные или информация, которыми обмениваются поставщики и подписчики. Каждое созданное сообщение, состоит из двух основных частей:
- Заголовок сообщения — определяет атрибут заголовка сообщения.
- Тело сообщения — содержимое сообщения, которым обмениваются.
В зависимости от шаблона обмена сообщениями сообщение может иметь свойства опубликовано, подтверждено, не подтверждено, повторно доставлено, готово и получено.
- Ключ маршрутизации — RabbitMQ может иметь много очередей сообщений. В этом случае каждое созданное сообщение должно иметь ключ виртуального адреса, который Exchange будет использовать для определения очереди, в которую должно быть направлено сообщение. Виртуальный адрес называется ключом маршрутизации.
- Привязка (Binding key) — привязывает очередь к Exchange. Exchange использует ключи привязки и маршрутизации, чтобы определить, какое сообщение принадлежит какой очереди.
Типы Exchanges:
Topic Exchanges — маршрутизация сообщений на основе шаблонов в ключе маршрутизации. Например: распределите данные, относящиеся к географическому местоположению, в зависимости от другого фактора, например точки продажи.
Fanout Exchanges — направляет сообщения во все привязанные к нему очереди, а ключ маршрутизации игнорируется. Отличным примером Fanout Exchange является групповой чат. RabbitMQ будет использовать этот сценарий для рассылки сообщений различным участникам этой конкретной группы.
Direct Exchanges — доставляет сообщения в очереди на основе ключа маршрутизации сообщений. Очередь должна совпадать с ключом маршрутизации. Он применяется при отправке сообщения отдельным лицам, например, при отправке уведомлений отдельным лицам в определенном географическом местоположении.
Headers Exchanges — игнорирует ключ маршрутизации и просматривает заголовки, отправленные вместе с сообщением. Headers Exchange — игнорирует ключ маршрутизации и просматривает заголовки, отправленные вместе с сообщением.
Как работает RabbitMQ
RabbitMQ используется в качестве брокера сообщений для реализации Advanced Messaging Queuing Protocol (AMQP).
При обмене сообщениями между поставщиками и подписчиками сообщения не отправляются непосредственно в очереди. Сначала они проходят через Exchange, который перенаправляет их в очереди назначения.
Поставщик будет создавать сообщения, а затем публиковать их в Exchange. Каждое сообщение имеет свой ключ маршрутизации.
Exchange гарантирует, что это сообщение окажется в правильной очереди. Чтобы Exchange гарантировал, что сообщение находится в правильных очередях, существует несколько факторов — типа обмена, который определяет количество правил маршрутизации, ключ маршрутизации и атрибут заголовка.
Думайте о Exchange как о почтальоне, гарантирующем, что сообщение попадет в нужные ящики. Ему понадобится правильный адрес, чтобы почта попала в нужные руки.
В этом примере правила маршрутизации, ключи маршрутизации и атрибуты заголовков действуют как адреса для сообщений. RabbitMQ использует их в качестве правил привязки для различных типов обмена, чтобы определить, какие сообщения ссылаются на какие очереди, в зависимости от ключа привязки очереди.
Как только сообщение окажется в нужной очереди, подписчик может запросить сообщение, которое он хочет использовать.
В итоге:
- Поставщик публикует сообщения для Exchange.
- Правило привязки (ключ маршрутизации) соединяет Exchange с очередью с помощью ключа привязки.
- Подписчик получает сообщения из очереди.
- Подписчик отправляет сообщение обратно брокеру и сообщает серверу, что он получил сообщение. Таким образом, брокер может удалить это сообщение из очереди.
Настройка RabbitMQ в Docker.
Мы настроим и запустим простой экземпляр RabbitMQ, используя Docker на нашем локальном компьютере вместе с пользовательским интерфейсом управления RabbitMQ и основными функциями администратора.
Я предполагаю, что у вас уже есть базовые знания о Docker и о том, как использовать docker-compose. Также убедитесь, что на вашем локальном компьютере установлен Docker.
Мы будем использовать docker compose.yml для настройки экземпляра RabbitMQ. Итак, создайте файл docker-compose.yml в нужном вам каталоге.
version: "3.8" services: rabbitmq3: container_name: "rabbitmq" image: rabbitmq:latest environment: - RABBITMQ_DEFAULT_USER=rabbit - RABBITMQ_DEFAULT_PASS=mypassword ports: # AMQP protocol port - '5672:5672' # HTTP management UI - '15672:15672'
Запустим наш compose файл:
docker-compose up -d
Откроем в браузере http://localhost:15672 . По этому адресу вы сможете получить доступ к веб интерфейсу RabbitMQ, логин/пароль который указали в docker-compose файле.
Тестирование работы RabbitMQ
Создаем Exchange с именем exchange-test:
И новую очередь queues-test:
А теперь биндим наш exchange-test с очередью queues-test.
Заходим во вкладку Exchanges, кликаем по exchange-test и биндим:
Должно получится так:
Теперь если зайти в Queues и выбрать нашу очередь будет так:
Можно пускать тестовое сообщение. Для этого нужно вернуться на вкладку Exchanges, выбрать наш exchange-test, открыть раздел отправки сообщения и отправить тестовое.
Переходим в раздел очередей и проверяем доставку сообщения в нашу очередь.
Появилось одно сообщение в нашей очереди, его можно просмотреть нажав на Get messages.
Как видим наш брокер отработал все верно, сообщение попало в нужную очередь. Теперь оно готовок тому что его заберет наш подписчик.
Теперь можем проверить работу нашего RabbitMQ с помощью скриптов. Подробнее в статье Проверка работы RabbitMQ на Python на нашем сайте.