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