En

JazzTeam Software Development Company

Agile Java Development

RabbitMQ Federation plugin

Введение

RabbitMQ – программный брокер сообщений – это приложение с открытым исходным кодом, которое поддерживает различные протоколы обмена сообщениями, такие как AMQP, MQTT, STOMP и другие.

Если ваше приложение необходимо развернуть в нескольких географических точках, то становится очень сложно поддерживать единый кластер для всех точек. Эту проблему можно решить, используя RabbitMQ Federation плагин: вы можете поддерживать несколько независимых кластеров RabbitMQ и пересылать сообщения между кластерами без особых проблем.

Использование Federation plugin

Существует 2 типа federation, которые задаются в момент создания:

При работе с Federation plugin сервера делятся на 2 типа:

  1. Upstream – это те сервера, на которых сообщения публикуются.
  2. Downstream – это сервера, куда переадресовываются сообщения.

Установка Federation Plugin

Для установки необходимо выполнить команду (при выполнении на Linux необходимо выполнять команду от суперпользователя):

rabbitmq-plugins enable rabbitmq_federation rabbitmq_federation_management

После чего необходимо выполнить перезапуск RabbitMQ, и в Web UI появятся новые пункты в меню Admin:

Настройка

До настройки federation необходимо выполнение условий:

Как и в случае shovel, для создания federation можно использовать:

Рассмотрим на примере 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-запросов.

  1. Создадим 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
     }
    }
  2. Создадим 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, где первый будет заниматься сбором данных разнесенных географически кластеров, а второй – переправлять сообщения внутри кластера.

Использованные ссылки

  1. https://www.rabbitmq.com/plugins.html
  2. https://www.cloudamqp.com/docs/shovel.html

, , , ,

Leave a Reply

Your email address will not be published. Required fields are marked *