RabbitMQ и Docker

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 на нашем сайте.

Добавить комментарий

Ваш адрес email не будет опубликован.