В предыдущей части 4 мы видели, как балансировать нагрузку удаленных потребителей в очереди, используя сетевые разъемы.
В этой части 5 мы увидим, как будет работать та же конфигурация, если у нас будет несколько удаленных абонентов длительного пользования по теме. Рассмотрим следующую конфигурацию …
Рисунок 1: Сеть брокеров — баланс нагрузки подписчиков по теме |
Как показано выше, у нас есть Broker-1, который инициирует два сетевых разъема для Broker-2 и Broker-3. Производитель отправляет сообщения в тему «moo.bar» на Broker-1, в то время как Broker-2 имеет подписчика C1, а Broker-3 имеет двух подписчиков C2 и C3 на одну и ту же тему «moo.bar».
Вы можете заметить, что эта установка очень похожа на часть 4 . Разница лишь в том, что здесь мы имеем дело с темами, а в части 4 мы имели дело с очередями.
Давайте посмотрим это в действии
- Добавьте следующую конфигурацию сетевого коннектора в файл конфигурации activemq.xml Broker-1:
0102030405060708091011121314151617181920212223242526
<
networkConnectors
>
<
networkConnector
name="T:broker1->broker2"
uri="static:(tcp://localhost:61626)"
duplex="false"
decreaseNetworkConsumerPriority="false"
networkTTL="2"
conduitSubscriptions="false"
dynamicOnly="true">
<
excludedDestinations
>
<
queue
physicalName=">" />
</
excludedDestinations
>
</
networkConnector
>
<
networkConnector
name="T:broker1->broker3"
uri="static:(tcp://localhost:61636)"
duplex="false"
decreaseNetworkConsumerPriority="false"
networkTTL="2"
conduitSubscriptions="false"
dynamicOnly="true">
<
excludedDestinations
>
<
queue
physicalName=">" />
</
excludedDestinations
>
</
networkConnector
>
</
networkConnectors
>
- Давайте начнем с брокера-2, брокера-3 и брокера-1 в таком порядке.
-
1
akuntamukkala@localhost~
/apache-activemq-5
.8.0
/cluster/broker-2/bin
$ .
/broker-2
console
-
1
akuntamukkala@localhost~
/apache-activemq-5
.8.0
/cluster/broker-3/bin
$ .
/broker-3
console
-
1
akuntamukkala@localhost~
/apache-activemq-5
.8.0
/cluster/broker-1/bin
$ .
/broker-1
console
- Соединения консоли администратора Broker-1 показывают, что два сетевых соединителя были установлены в соответствии с настройками от Broker-1 до Broker-2 и Broker-3 соответственно:
- Давайте запустим подписчика C1 на Broker-2, подписавшегося на сообщения в теме «moo.bar», и подписчиков C2 и C3 на Broker-3, подписавшегося на сообщения в той же теме «moo.bar».
- Для постоянных подписчиков требуется уникальная комбинация идентификатора клиента и имени подписчика. Для того чтобы мы могли создать надежных подписчиков C2 и C3, нам нужно улучшить функциональность, представленную в /Users/akuntamukkala/apache-activemq-5.8.0/example/src/ConsumerTool.java где /Users/akuntamukkala/apache-activemq-5.8 .0 это каталог, в котором установлен ActiveMQ.
- Измененный код состоит из редактирования build.xml и ConsumerTool.java для добавления нового параметра «subscriberName». Отредактированные файлы build.xml и ConsumerTool.java можно получить здесь и здесь соответственно.
- Давайте начнем подписчиков сейчас.
-
1
akuntamukkala@localhost~
/apache-activemq-5
.8.0
/example
$ <b>ant consumer -Durl=tcp:
//localhost
:61626 -Dtopic=
true
-Dsubject=moo.bar -DclientId=C1 -Ddurable=
true
-DsubscriberName=mb.C1<
/b
>
-
1
akuntamukkala@localhost~
/apache-activemq-5
.8.0
/example
$ <b>ant consumer -Durl=tcp:
//localhost
:61636 -Dtopic=
true
-Dsubject=moo.bar -DclientId=C2 -Ddurable=
true
-DsubscriberName=mb.C2<
/b
>
-
1
akuntamukkala@localhost~
/apache-activemq-5
.8.0
/example
$ <b>ant consumer -Durl=tcp:
//localhost
:61636 -Dtopic=
true
-Dsubject=moo.bar -DclientId=C3 -Ddurable=
true
-DsubscriberName=mb.C3<
/b
>
- Долговечный абонент на Брокер-2:
HTTP: // локальный: 9161 / администратор / subscribers.jsp - Долгосрочные подписчики на Брокер-3:
HTTP: // локальный: 10161 / администратор / subscribers.jsp - Постоянные подписчики на Брокер-1 (из-за сетевых разъемов):
HTTP: // локальный: 8161 / администратор / subscribers.jsp - Теперь давайте отправим 10 долговременных сообщений в тему moo.bar на Broker-1.
-
1
akuntamukkala@localhost~
/apache-activemq-5
.8.0
/example
$ <b>ant producer -Durl=tcp:
//localhost
:61616 -Dtopic=
true
-Dsubject=moo.bar -Dmax=10 -Ddurable=
true
<
/b
>
- Смотрите консоль на Broker-3:
Вывод файла журнала на Broker-3 - Как вы можете заметить, Broker-3 получает одно и то же сообщение дважды, по одному на каждую подписку C2 и C3. ActiveMQ по умолчанию не разрешает обработку дублирующихся сообщений.
- Это происходит потому, что подписки mb.C2 и mb.C3 на Broker-3 распространяются на Broker-1. Поэтому, когда 10 сообщений публикуются на moo.bar на Broker-1, эти сообщения отправляются подписчикам mb.C2 и mb.C3 на одном и том же брокере: Broker-3. Поскольку сообщения имеют одинаковый идентификатор, повторяющиеся сообщения отбрасываются и, следовательно, предупреждение отображается в сообщениях журнала… (показано на шаге 19).
- Вот консоль, показывающая статистику по Broker-1:
HTTP: // локальный: 8161 / администратор / subscribers.jsp - Вот консоль, отображающая статистику по Broker-3:
HTTP: // локальный: 10161 / администратор / subscribers.jsp - Как вы можете видеть, несмотря на то, что счетчик очереди показывает 20, счетчик очереди показывает только 10, так как остальные 10 сообщений были удалены Брокером-3. Это полезная функция, которая помогает гарантировать, что сообщение обрабатывается брокером не более одного раза.
Соединения Брокера-1 @ http: // localhost: 8161 / admin / connections.jsp |
Причина, по которой это происходит, заключается в том, что обе подписки C2 и C3 распространяются на вышестоящего брокера Broker-1.
Дубликаты сообщений на брокере-3 |
Давайте попробуем повторить тот же сценарий, используя небольшую настройку в настройках сетевого разъема, установив значение wireitSubscription = «true».
на обоих сетевых разъемах от Broker-1 до Broker-2 и Broker-3 соответственно. После перезапуска брокеров удалите неактивных постоянных подписчиков и повторите описанные выше шаги.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
< networkConnectors > < networkConnector name="T:broker1->broker2" uri="static:(tcp://localhost:61626)" duplex="false" decreaseNetworkConsumerPriority="false" networkTTL="2" conduitSubscriptions="true" dynamicOnly="true"> < excludedDestinations > < queue physicalName=">" /> </ excludedDestinations > </ networkConnector > < networkConnector name="T:broker1->broker3" uri="static:(tcp://localhost:61636)" duplex="false" decreaseNetworkConsumerPriority="false" networkTTL="2" conduitSubscriptions="true" dynamicOnly="true"> < excludedDestinations > < queue physicalName=">" /> </ excludedDestinations > </ networkConnector > </ networkConnectors > |
На следующем снимке экрана показано, что брокер-1 теперь видит только двух постоянных подписчиков, по одному от каждого брокера, брокер-2 и брокер-3.
Долгосрочные подписчики в Брокере-1, если для WireitSubscription = «true» |
После публикации 10 долговременных сообщений в Broker-1 мы обнаруживаем, что на этот раз у нас не возникает повторяющихся сообщений.
Как и ожидалось, все 10 сообщений обрабатываются C1, C2 и C3, как показано на скриншотах ниже.
Брокер-1 по тематике подписчиков |
Абоненты долгосрочных тем Broker-3 C2 и C3 получают и обрабатывают 10 сообщений каждое |
Таким образом, мы увидели, как атрибут проводника подписок может помочь уменьшить трафик сообщений, избегая дублирования сообщений в сети брокеров.
В следующей части 6 мы увидим, как ActiveMQ предоставляет возможности «воспроизведения сообщений» для предотвращения застревания сценариев сообщений.
Ссылка: | ActiveMQ — Объяснение сети брокеров — часть 5 от нашего партнера по JCG Ашвини Кунтамуккала в |