Теперь, когда мы поняли основы сетевого коннектора ActiveMQ в части 1 и части 2 этой серии блогов, в этой части 3 мы рассмотрим, как балансировка нагрузки ActiveMQ используется для потребителей, которые подключаются к сети брокеров.
Вступление
Параллельные потребители используются, когда сообщения в очереди могут обрабатываться не по порядку и обычно для повышения пропускной способности. Брокер ActiveMQ распределяет сообщения круговым способом среди потребителей, чтобы распределить потребление сообщений между параллельными потребителями, если потребитель не указан как исключительный .
Давайте посмотрим на следующий пример, где три потребителя одновременно обрабатывают сообщения из очереди foo.bar. Производитель ставит в очередь 60 сообщений, которые обрабатываются тремя потребителями (по 20 каждый) в циклическом порядке.
Запустить трех одновременно работающих потребителей в очереди foo.bar
| 
 1 
2 
 | 
Ashwinis-MacBook-Pro:example akuntamukkala$ pwd/Users/akuntamukkala/apache-activemq-5.8.0/example | 
| 
 1 
 | 
Ashwinis-MacBook-Pro:example akuntamukkala$ ant consumer -Durl=tcp://localhost:61616 -Dtopic=false -Dsubject=foo.bar -DparallelThreads=3 -Dmax=20 | 
Произвести 60 сообщений
| 
 1 
 | 
Ashwinis-MacBook-Pro:example akuntamukkala$ ant producer -Durl=tcp://localhost:61616 -Dtopic=false -Dsubject=foo.bar -Dmax=60 | 
На следующем снимке экрана 3 потребителя обрабатывают сообщения из очереди foo.bar. 60 сообщений были помещены в очередь и удалены из очереди.
Как показано ниже, 20 сообщений были обработаны каждым из потребителей.
Следующая выдержка из журнала показывает, что сообщения распределены среди трех потребителей …
| 
 01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
 | 
[Thread-3] Received: 'Message: 1 sent at: Tue Mar 04 13:46:53 IST 2014  ...' (length 1000)[Thread-2] Received: 'Message: 0 sent at: Tue Mar 04 13:46:53 IST 2014  ...' (length 1000)[Thread-1] Received: 'Message: 2 sent at: Tue Mar 04 13:46:53 IST 2014  ...' (length 1000)[Thread-3] Received: 'Message: 4 sent at: Tue Mar 04 13:46:53 IST 2014  ...' (length 1000)[Thread-2] Received: 'Message: 3 sent at: Tue Mar 04 13:46:53 IST 2014  ...' (length 1000)[Thread-1] Received: 'Message: 5 sent at: Tue Mar 04 13:46:53 IST 2014  ...' (length 1000)[Thread-3] Received: 'Message: 7 sent at: Tue Mar 04 13:46:53 IST 2014  ...' (length 1000)[Thread-2] Received: 'Message: 6 sent at: Tue Mar 04 13:46:53 IST 2014  ...' (length 1000)[Thread-1] Received: 'Message: 8 sent at: Tue Mar 04 13:46:53 IST 2014  ...' (length 1000)[Thread-3] Received: 'Message: 10 sent at: Tue Mar 04 13:46:53 IST 2014 ...' (length 1000) | 
Теперь, когда мы увидели, как параллельные потребители работают с одним брокером, теперь мы рассмотрим, как они работают, когда потребители распределены по сети брокеров.
Местные против удаленных потребителей
Давайте рассмотрим, как ActiveMQ обрабатывает локальных и удаленных потребителей с помощью конфигурации, показанной на рисунке ниже.
Consumer-1 и Consumer-2 получают сообщения из очереди foo.bar в Broker-1 и Broker-2 соответственно. Broker-1 установил сетевой соединитель с Broker-2 для пересылки сообщений в очереди. Производитель помещает сообщения в очередь foo.bar на Broker-1
Давайте посмотрим это в действии
- Отредактируйте конфигурацию Broker-1 /Users/akuntamukkala/apache-activemq-5.8.0/bridge-demo/broker-1/conf/activemq.xml и откройте сетевой соединитель для Broker-2 и перезапустите Broker-1 и Broker-2
 
| 
 01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
 | 
<networkConnectors>                <networkConnector                        name="T:broker1->broker2"                        uri="static:(tcp://localhost:61626)"                        duplex="false"                        decreaseNetworkConsumerPriority="false"                        networkTTL="2"                        dynamicOnly="true">                        <excludedDestinations>                                <queue physicalName=">" />                        </excludedDestinations>                </networkConnector>                <networkConnector                        name="Q:broker1->broker2"                        uri="static:(tcp://localhost:61626)"                        duplex="false"                        decreaseNetworkConsumerPriority="false"                        networkTTL="2"                        dynamicOnly="true">                        <excludedDestinations>                                <topic physicalName=">" />                        </excludedDestinations>                </networkConnector>        </networkConnectors> | 
- Начните местный потребитель, Потребитель-1
 
| 
 1 
 | 
Ashwinis-MacBook-Pro:example akuntamukkala$ ant consumer -Durl=tcp://localhost:61616 -Dtopic=false -Dsubject=foo.bar | 
- Пуск удаленного потребителя, Потребитель-2
 
| 
 1 
 | 
Ashwinis-MacBook-Pro:example akuntamukkala$ ant consumer -Durl=tcp://localhost:61626 -Dtopic=false -Dsubject=foo.bar | 
- Начать продюсера на Брокер-1, чтобы поставить в очередь 100 сообщений
 
| 
 1 
 | 
Ashwinis-MacBook-Pro:example akuntamukkala$ ant producer -Durl=tcp://localhost:61616 -Dtopic=false -Dsubject=foo.bar -Dmax=100 | 
Снимок экрана, показывающий очереди Брокера-1:
Давайте посмотрим на потребителей, чтобы увидеть, как сообщения были разделены.
Как вы можете заметить, брокер ActiveMQ отправляет сообщения в равной степени локальному потребителю через удаленного потребителя, предоставляя им одинаковый приоритет.
Удаленный потребитель, Consumer-2, является только посредником в 1 переходе, что меньше настроенного значения networkTTL, равного 2.
Это приводит к неоптимальным маршрутам, особенно когда брокеры подключены таким образом, что между производителями и потребителями возможны несколько маршрутов. Для обеспечения кратчайшего пути между производителями и потребителями предпочтительнее отправлять их местным потребителям, а не удаленным.
  ActiveMQ предоставляет способ настроить приоритет между локальным потребителем и удаленным потребителем, используя свойство 
  Понижение NetworkConsumerPriority на сетевом разъеме. 
По умолчанию это значение равно false, и, следовательно, локальные и удаленные посредники рассматриваются одинаково.
Если мы повторим вышеупомянутые шаги после изменения lowerNetworkConsumerPriority = «true», то мы обнаружим, что локальному потребителю, Consumer-1, отдается предпочтение перед удаленным потребителем, Consumer-2, который находится на расстоянии одного перехода брокера.
 
  ActiveMQ разумно определяет кратчайший путь в сети посредников между производителями сообщений и потребителями. 
Пожалуйста, прочитайте следующую ссылку, чтобы получить дополнительное понимание оптимальной маршрутизации ActiveMQ.
На этом мы завершаем часть 3 этой серии, в которой мы увидели, как различать локальных и удаленных потребителей, чтобы помочь ActiveMQ определить наиболее оптимальный путь между производителями сообщений и потребителями.
Как всегда ваши комментарии очень приветствуются.
Оставайтесь с нами в части 4, где мы рассмотрим балансировку нагрузки удаленных параллельных потребителей…
| Ссылка: | ActiveMQ — Объяснение сети брокеров — часть 3 от нашего партнера по JCG Ашвини Кунтамуккала в | 




