В предыдущей части 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.
<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 в таком порядке.
-
akuntamukkala@localhost~/apache-activemq-5.8.0/cluster/broker-2/bin$
./broker-2 console -
akuntamukkala@localhost~/apache-activemq-5.8.0/cluster/broker-3/bin$
./broker-3 console -
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 можно получить здесь и здесь соответственно.
- Давайте начнем подписчиков сейчас.
- akuntamukkala@localhost~/apache-activemq-5.8.0/example$ муравей-потребитель -Durl = tcp: // localhost: 61626 -Dtopic = true -Dsubject = moo.bar -DclientId = C1 -Ddurable = true -DsubscriberName = mb. С1
- akuntamukkala@localhost~/apache-activemq-5.8.0/example$ муравей-потребитель -Durl = tcp: // localhost: 61636 -Dtopic = true -Dsubject = moo.bar -DclientId = C2 -Ddurable = true -DsubscriberName = mb. С2
- akuntamukkala@localhost~/apache-activemq-5.8.0/example$ ant consumer -Durl = tcp: // localhost: 61636 -Dtopic = true -Dsubject = moo.bar -DclientId = C3 -Ddurable = true -DsubscriberName = mb. C3
- Надежный абонент на Брокер-2
HTTP: // локальный: 9161 / администратор / subscribers.jsp - Долгосрочные подписчики на Брокер-3
HTTP: // локальный: 10161 / администратор / subscribers.jsp - Постоянные подписчики на Брокер-1 (из-за сетевых разъемов)
HTTP: // локальный: 8161 / администратор / subscribers.jsp - Теперь давайте отправим 10 долговременных сообщений в тему moo.bar на Broker-1.
- akuntamukkala@localhost~/apache-activemq-5.8.0/example$ муравей-производитель -Durl = tcp: // localhost: 61616 -Dtopic = true -Dsubject = moo.bar -Dmax = 10 -Ddurable = true
- Смотрите консоль на Брокер-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)
- Вот консоль, показывающая статистику по Брокеру-1
HTTP: // локальный: 8161 / администратор / subscribers.jsp - Вот консоль, показывающая статистику по Брокеру-3
HTTP: // локальный: 10161 / администратор / subscribers.jsp - Как вы можете видеть, несмотря на то, что счетчик очереди показывает 20, счетчик очереди показывает только 10, так как остальные 10 сообщений были удалены Брокером-3. Это полезная функция, которая помогает гарантировать, что сообщение обрабатывается брокером не более одного раза.
Соединения Брокера-1 @ http: // localhost: 8161 / admin / connections.jsp |
Причина этого заключается в том, что обе подписки C2 и C3 распространяются на вышестоящего брокера Broker-1.
Попробуем повторить тот же сценарий, используя небольшую настройку параметров сетевого соединителя,
установив значение wireitSubscription = «true»
на обоих сетевых соединителях от Broker-1 до Broker-2 и Broker-3 соответственно. После перезапуска брокеров удалите неактивных постоянных подписчиков и повторите описанные выше шаги.
<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.
Долгосрочные подписчики в Broker-1, если для WireitSubscription = «true» |
После публикации 10 долговременных сообщений в Broker-1 мы обнаруживаем, что на этот раз у нас не возникает повторяющихся сообщений.
Как и ожидалось, все 10 сообщений обрабатываются C1, C2 и C3, как показано на скриншотах ниже.
Брокер-1 по тематике подписчиков |
Абоненты долгосрочных тем Broker-3 C2 и C3 получают и обрабатывают 10 сообщений каждое |
Таким образом, мы увидели, как атрибут проводника подписок может помочь уменьшить трафик сообщений, избегая дублирования сообщений в сети брокеров.
В следующей части 6 мы увидим, как ActiveMQ предоставляет возможности «воспроизведения сообщений» для предотвращения застревания сценариев сообщений.