Статьи

ActiveMQ — объяснена сеть брокеров — часть 3

Теперь, когда мы поняли основы сетевого коннектора 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 сообщений были помещены в очередь и удалены из очереди.

брокерско-1-60msgs-одновременные-потребители

Как показано ниже, 20 сообщений были обработаны каждым из потребителей.

брокер-1-CC-60msgs

Следующая выдержка из журнала показывает, что сообщения распределены среди трех потребителей …

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:

брокер-1-CC-100ed

Давайте посмотрим на потребителей, чтобы увидеть, как сообщения были разделены.

брокер-1-localvsremote равных

Как вы можете заметить, брокер ActiveMQ отправляет сообщения в равной степени локальному потребителю через удаленного потребителя, предоставляя им одинаковый приоритет.

Удаленный потребитель, Consumer-2, является только посредником в 1 переходе, что меньше настроенного значения networkTTL, равного 2.

Это приводит к неоптимальным маршрутам, особенно когда брокеры подключены таким образом, что между производителями и потребителями возможны несколько маршрутов. Для обеспечения кратчайшего пути между производителями и потребителями предпочтительнее отправлять их местным потребителям, а не удаленным.

ActiveMQ предоставляет способ настроить приоритет между локальным потребителем и удаленным потребителем, используя свойство
Понижение NetworkConsumerPriority на сетевом разъеме.

По умолчанию это значение равно false, и, следовательно, локальные и удаленные посредники рассматриваются одинаково.

Если мы повторим вышеупомянутые шаги после изменения lowerNetworkConsumerPriority = «true», то мы обнаружим, что локальному потребителю, Consumer-1, отдается предпочтение перед удаленным потребителем, Consumer-2, который находится на расстоянии одного перехода брокера.

брокер-1-localvsremote
ActiveMQ разумно определяет кратчайший путь в сети посредников между производителями сообщений и потребителями.

Пожалуйста, прочитайте следующую ссылку, чтобы получить дополнительное понимание оптимальной маршрутизации ActiveMQ.

На этом мы завершаем часть 3 этой серии, в которой мы увидели, как различать локальных и удаленных потребителей, чтобы помочь ActiveMQ определить наиболее оптимальный путь между производителями сообщений и потребителями.

Как всегда ваши комментарии очень приветствуются.

Оставайтесь с нами в части 4, где мы рассмотрим балансировку нагрузки удаленных параллельных потребителей…

Ссылка: ActiveMQ — Объяснение сети брокеров — часть 3 от нашего партнера по JCG Ашвини Кунтамуккала в