Статьи

Active MQ — объяснена сеть брокеров (часть пятая)

В предыдущей части 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>


  1. Давайте начнем с брокера-2, брокера-3 и брокера-1 в таком порядке.

  2. akuntamukkala@localhost~/apache-activemq-5.8.0/cluster/broker-2/bin$
    ./broker-2 console

  3. akuntamukkala@localhost~/apache-activemq-5.8.0/cluster/broker-3/bin$
    ./broker-3 console

  4. akuntamukkala@localhost~/apache-activemq-5.8.0/cluster/broker-1/bin$
    ./broker-1 console

  5. Соединения консоли администратора Broker-1 показывают, что два сетевых соединителя были установлены в соответствии с настройками от Broker-1 до Broker-2 и Broker-3 соответственно
  6. Соединения Брокера-1 @ http: // localhost: 8161 / admin / connections.jsp
  7. Давайте запустим подписчика C1 на Broker-2, подписавшегося на сообщения в теме «moo.bar», и подписчиков C2 и C3 на Broker-3, подписавшегося на сообщения в той же теме «moo.bar»
  8. Для постоянных подписчиков требуется уникальная комбинация идентификатора клиента и имени подписчика. Для того чтобы мы могли создать надежных подписчиков C2 и C3, нам нужно улучшить функциональность, представленную в /Users/akuntamukkala/apache-activemq-5.8.0/example/src/ConsumerTool.java где /Users/akuntamukkala/apache-activemq-5.8 .0 это каталог, в котором установлен ActiveMQ.
  9. Измененный код состоит из редактирования build.xml и ConsumerTool.java для добавления нового параметра «subscriberName». Отредактированные файлы build.xml и ConsumerTool.java можно получить  здесь  и  здесь  соответственно.
  10. Давайте начнем подписчиков сейчас.
  11. akuntamukkala@localhost~/apache-activemq-5.8.0/example$ муравей-потребитель -Durl = tcp: // localhost: 61626 -Dtopic = true -Dsubject = moo.bar -DclientId = C1 -Ddurable = true -DsubscriberName = mb. С1
  12. akuntamukkala@localhost~/apache-activemq-5.8.0/example$ муравей-потребитель -Durl = tcp: // localhost: 61636 -Dtopic = true -Dsubject = moo.bar -DclientId = C2 -Ddurable = true -DsubscriberName = mb. С2
  13. 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
  14. Надежный абонент на Брокер-2
    HTTP: // локальный: 9161 / администратор / subscribers.jsp
  15. Долгосрочные подписчики на Брокер-3

    HTTP: // локальный: 10161 / администратор / subscribers.jsp
  16. Постоянные подписчики на Брокер-1 (из-за сетевых разъемов)

    HTTP: // локальный: 8161 / администратор / subscribers.jsp
  17.  Теперь давайте отправим 10 долговременных сообщений в тему moo.bar на Broker-1.
  18. akuntamukkala@localhost~/apache-activemq-5.8.0/example$ муравей-производитель -Durl = tcp: // localhost: 61616 -Dtopic = true -Dsubject = moo.bar -Dmax = 10 -Ddurable = true
  19. Смотрите консоль на Брокер-3
    Вывод файла журнала на Broker-3
  20. Как вы можете заметить, Broker-3 получает одно и то же сообщение дважды, по одному на каждую подписку C2 и C3. ActiveMQ по умолчанию не разрешает обработку дублирующихся сообщений.
  21. Это происходит потому, что подписки mb.C2 и mb.C3 на Broker-3 распространяются на Broker-1. Поэтому, когда 10 сообщений публикуются на moo.bar в Broker-1, эти сообщения отправляются подписчикам mb.C2 и mb.C3 в одном и том же брокере: Broker-3. Поскольку сообщения имеют одинаковый идентификатор, дубликаты сообщений отбрасываются и, следовательно, предупреждение отображается в сообщениях журнала …. (показано на шаге 19)
  22. Вот консоль, показывающая статистику по Брокеру-1

    HTTP: // локальный: 8161 / администратор / subscribers.jsp
  23. Вот консоль, показывающая статистику по Брокеру-3

    HTTP: // локальный: 10161 / администратор / subscribers.jsp
  24. Как вы можете видеть, несмотря на то, что счетчик очереди показывает 20, счетчик очереди показывает только 10, так как остальные 10 сообщений были удалены Брокером-3. Это полезная функция, которая помогает гарантировать, что сообщение обрабатывается брокером не более одного раза.

Причина этого заключается в том, что обе подписки C2 и C3 распространяются на вышестоящего брокера Broker-1. 
Дубликаты сообщений на брокере-3

Попробуем повторить тот же сценарий, используя небольшую настройку параметров сетевого соединителя,
установив значение 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 предоставляет возможности «воспроизведения сообщений» для предотвращения застревания сценариев сообщений.