Теперь, когда мы поняли основы сетевого коннектора 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 Ашвини Кунтамуккала в |