ДжазТим — надежный технологический партнер

Agile разработка ПО на Java

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:

Installing Federation Plugin

Настройка

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

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

Рассмотрим на примере Web UI и REST API.

Первым шагом необходимо создать на обоих серверах queue, exchange и указать routing для их связывания. При этом необязательно, чтобы на локальном и удаленном сервере совпадали виртуальные хосты (vhost), на которых созданы queue, exchange.

Setting Up

Создание через Web UI

Далее на Downstream сервере необходимо перейти в меню Admin > Federation Upstreams. Для этого необходимо заполнить обязательные поля Name и URI. При этом URI может задаваться в нескольких форматах. Например, можно использовать: amqp://<user>:<password>@<IP/DNS_name>/<vhost>. Также, как в случае с Shovel plugin, при создании можно указать режим подтверждения сообщений: on-confirm, on-publish или no-ack.

Federation Upstreams

Далее необходимо создать объект policies, для этого переходим в Admin > Policies.

Policies

В поле Name указываем любое название.

В поле Pattern указываем регулярное выражение, которое будет определять, какие exchange (queue) необходимо будет обрабатывать.Если необходимо обрабатывать все существующие exchange или queue, вводим — “.*”.

В поле Apply to выбираем, что необходимо обрабатывать, exchange/queue или всё вместе.

В Definition указываем federation-upstream-set и в качестве значения all.

Если после этого зайти на Upstream сервер, то можно увидеть, что был создан federation exchange:

Federation Exchange

В exchange TEST в качестве связи указан federation. И теперь при публикации сообщений он будет попадать на оба сервера для обработки.

Exchange TEST

Создание с использованием 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

Federation Status

Теперь, если отправить сообщение на сервере Upstream, оно будет переправлено на Downstream:

Downstream

Заключение

В этой статье был рассмотрен пример создания federation для двух кластеров RabbitMQ, но это не значит, что нельзя подключить большее число кластеров. Настраивать плагин достаточно просто и удобно, но, главное, не забывать, что существует 2 типа federation. В случае использования exchange, сообщения будут дублироваться на обоих кластерах, поэтому необходимо не забывать об этом при разработке архитектуры приложения. Federation можно удобно использовать совместно с плагином Shovel, где первый будет заниматься сбором данных разнесенных географически кластеров, а второй — переправлять сообщения внутри кластера.

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

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