Механизмы балансировки нагрузки внутри кластера SMB#

Балансировка нагрузки используется для распределения входящих сообщений между несколькими брокерами в кластере. При балансировке продюсер пишет сообщения в адрес. Балансировка регулируется настройкой message_load_balancing в конфигурационном файле broker.xml в блоке cluster-connection:

  • если этот параметр установлен в значение OFF, то сообщения никогда не будут перенаправляться на другой узел в кластере;

  • если этот параметр установлен в значение ON_DEMAND, сообщения будут перенаправляться только на другие узлы кластера, если адрес, на который они перенаправляются, имеет очереди, имеющие потребителей, и если эти потребители имеют фильтры сообщений (селекторы), по крайней мере один из этих селекторов должен соответствовать сообщению;

  • если этот параметр установлен в значение OFF_WITH_REDISTRIBUTION, то, как и при значении OFF, сообщения изначально не будут маршрутизироваться на другие узлы в кластере. Однако, если предусмотрена редистрибуция, она может перенаправлять сообщения обычным способом.

С помощью редистрибуции сообщений может быть сконфигурирована автоматическая редистрибуция сообщений из очередей, которые не имеют потребителей или потребителей с фильтрами, которые не соответствуют сообщениям. Сообщения перенаправляются на другие узлы кластера, которые имеют соответствующих потребителей. Чтобы включить редистрибуцию, параметр message-load-balancing должен быть установлен в значение ON_DEMAND или OFF_WITH_REDISTRIBUTION.

Редистрибуция сообщений может быть сконфигурирована так, чтобы она начинала действовать немедленно после обнаружения необходимости редистрибуции, или настроить задержку перед редистрибуцией с помощью параметра redistribution-delay в файле broker.xml в блоке address-settings:

<address-settings>
   <address-setting match="#">
      <redistribution-delay>0</redistribution-delay>
   </address-setting>
</address-settings>

Вышеприведенный блок настроек адресов установит задержку редистрибуции равной 0 для любой очереди, которая связана с любым адресом.

Редистрибуция и балансировка

Запуск редистрибуции:

  • Редистрибуция запускается отдельно для каждой очереди.

  • Редистрибуция запускается только в том случае, если на локальной очереди нет консьюмеров.

  • Редистрибутор у очереди в единственном экземпляре, независимо от кол-ва брокеров в кластере.

  • Редистрибуция запускается при получении одного из трех типов уведомлений:

    • BINDING_ADDED, при условии что брокер знает о наличии такой же очереди на других брокерах (наличие RemoteBinding в адресе) и у этих очередей есть консьюмеры;

    • CONSUMER_CREATED, при условии, что консьюмер создан на другом брокере;

    • CONSUMER_CLOSED, при условии, что консьюмер был закрыт на локальном брокере и кол-во консьюмеров <=0.

Общие условия запуска редистрибуции

Условие

Работает

Покрывается балансировкой

При запуске брокера, если на других брокерах есть очереди с таким же названием и подключенными консьюмерами

Не работает с anycast очередями, если имя очереди не совпадает с именем адреса

Да

При создании новой очереди в рантайме, если на других брокерах есть очереди с таким же названием и подключенными консьюмерами

Да

Да

При подключении консьюмера к очереди с таким же именем на другом брокере

Да

Да

При отключении последнего консьюмера от локальной очереди, если на других брокерах есть очереди с таким же названием и подключенными консьюмерами

Не работает с anycast очередями, если имя очереди не совпадает с именем адреса

Да

Важно: Механизмы балансировки и редистрибуции негативно влияют на производительность брокеров и могут выступать узким местом при передаче сообщений между брокерами, т.к. отправка сообщений на другой брокер производится одним продюсером в один поток. В связи с этим рекомендуется подключать консьюмеры ко всем брокерам в кластере и полагаться на механизмы балансировки/редистрибуции только при нештатных ситуациях (например временная потеря соединения с брокером или плановая перезагрузка консьюмеров).