RabbitMQ Federation plugin
Введение
RabbitMQ – программный брокер сообщений – это приложение с открытым исходным кодом, которое поддерживает различные протоколы обмена сообщениями, такие как AMQP, MQTT, STOMP и другие.
Если ваше приложение необходимо развернуть в нескольких географических точках, то становится очень сложно поддерживать единый кластер для всех точек. Эту проблему можно решить, используя RabbitMQ Federation плагин: вы можете поддерживать несколько независимых кластеров RabbitMQ и пересылать сообщения между кластерами без особых проблем.
Использование Federation plugin
Существует 2 типа federation, которые задаются в момент создания:
- federation exchange. Используется для передачи сообщения на другой сервер/кластер. При этом сообщения, которые публикуются на федеративных RabbitMQ, будут опубликованы на локальном сервере обмена и последующих серверах. Вариант использования: случай, когда необходимо передать одно то же сообщение в несколько мест.
- federation queue. Основная задача этого типа – интеллектуальная балансировка нагрузки сообщений, сообщения будут отправляться только на сервера, расположенные “ниже по потоку”, когда потребители будут только получать (потреблять) сообщения. При этом сообщения не дублируются. Можно использовать для распределения нагрузки между серверами.
При работе с Federation plugin сервера делятся на 2 типа:
- Upstream – это те сервера, на которых сообщения публикуются.
- Downstream – это сервера, куда переадресовываются сообщения.
Установка Federation Plugin
Для установки необходимо выполнить команду (при выполнении на Linux необходимо выполнять команду от суперпользователя):
rabbitmq-plugins enable rabbitmq_federation rabbitmq_federation_management
После чего необходимо выполнить перезапуск RabbitMQ, и в Web UI появятся новые пункты в меню Admin:
Настройка
До настройки federation необходимо выполнение условий:
- минимум 2 сервера RabbitMQ;
- включен плагин federation;
- открыт доступ на порту 5672.
Как и в случае shovel, для создания federation можно использовать:
- утилиту rabbitmqctl;
- Rest API;
- Web UI.
Рассмотрим на примере Web UI и REST API.
Первым шагом необходимо создать на обоих серверах queue, exchange и указать routing для их связывания. При этом необязательно, чтобы на локальном и удаленном сервере совпадали виртуальные хосты (vhost), на которых созданы queue, exchange.
Создание через Web UI
Далее на Downstream сервере необходимо перейти в меню Admin > Federation Upstreams. Для этого необходимо заполнить обязательные поля Name и URI. При этом URI может задаваться в нескольких форматах. Например, можно использовать: amqp://<user>:<password>@<IP/DNS_name>/<vhost>. Также, как в случае с Shovel plugin, при создании можно указать режим подтверждения сообщений: on-confirm, on-publish или no-ack.
Далее необходимо создать объект policies, для этого переходим в Admin > Policies.
В поле Name указываем любое название.
В поле Pattern указываем регулярное выражение, которое будет определять, какие exchange (queue) необходимо будет обрабатывать.Если необходимо обрабатывать все существующие exchange или queue, вводим – “.*”.
В поле Apply to выбираем, что необходимо обрабатывать, exchange/queue или всё вместе.
В Definition указываем federation-upstream-set и в качестве значения all.
Если после этого зайти на Upstream сервер, то можно увидеть, что был создан federation exchange:
В exchange TEST в качестве связи указан federation. И теперь при публикации сообщений он будет попадать на оба сервера для обработки.
Создание с использованием REST API
На сервере Downstream необходимо будет выполнить несколько PUT-запросов.
- Создадим federation upstream. Необходимо отправить запрос по адресу /api/policies/{{virtual_host}}/{{policie_name}}, со следующим содержимым:
{
“value”:{
“uri”:”amqp://user:resu@192.168.1.87/host_3″,
“expires”:3600000,
“ack-mode”: “on-confirm”,
“prefetch-count”: 100
}
} - Создадим policy. Для этого отправим запрос по адресу /api/policies/{{virtual_host}}/{{policie_name}}, с содержимым:
{
“pattern”:”^TEST*.”,
“definition”:{
“federation-upstream-set”:”all”
},
“priority”:0,
“apply-to”:”exchanges”
}
После выполнения запросов можно проверить статус работы в WebUI. Для этого переходим в Admin > Federation Status, где можно увидеть статус работы federation
Теперь, если отправить сообщение на сервере Upstream, оно будет переправлено на Downstream:
Заключение
В этой статье был рассмотрен пример создания federation для двух кластеров RabbitMQ, но это не значит, что нельзя подключить большее число кластеров. Настраивать плагин достаточно просто и удобно, но, главное, не забывать, что существует 2 типа federation. В случае использования exchange, сообщения будут дублироваться на обоих кластерах, поэтому необходимо не забывать об этом при разработке архитектуры приложения. Federation можно удобно использовать совместно с плагином Shovel, где первый будет заниматься сбором данных разнесенных географически кластеров, а второй – переправлять сообщения внутри кластера.
Использованные ссылки
XXVI SQA Days и как поймать удачу тестировщику Кто он и откуда, этот Невидимый Санта или Тайный Друг?