现在,我们已经在本博客系列的第1部分和第2 部分中了解了ActiveMQ网络连接器的基础,在第3部分中,我们将研究ActiveMQ如何平衡连接到代理网络的使用者。
介绍
当可以无序处理队列中的消息时通常使用并发使用者,通常可以提高消息吞吐量。 ActiveMQ代理以循环方式在使用者之间调度消息,以便在并发使用者之间平衡消息消耗,除非将使用者指定为独占 。
让我们看下面的示例,其中三个使用者同时处理来自队列foo.bar的消息。 生产者排队60条消息,这些消息由三个消费者(每个20位)以循环方式处理。
在队列foo.bar上启动三个并发使用者
Ashwinis-MacBook-Pro:example akuntamukkala$ pwd
/Users/akuntamukkala/apache-activemq-5.8.0/example
Ashwinis-MacBook-Pro:example akuntamukkala$ ant consumer -Durl=tcp://localhost:61616 -Dtopic=false -Dsubject=foo.bar -DparallelThreads=3 -Dmax=20
产生60条消息
Ashwinis-MacBook-Pro:example akuntamukkala$ ant producer -Durl=tcp://localhost:61616 -Dtopic=false -Dsubject=foo.bar -Dmax=60
以下屏幕快照显示了3个使用者正在处理来自队列foo.bar的消息。 入队和出队60条消息。
如下所示,每个使用者处理了20条消息。
以下摘录自日志,显示消息被划分为三个使用者。
[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如何处理本地和远程使用者。
消费者1和消费者2分别使用来自Broker-1和Broker-2上的队列foo.bar的消息。 Broker-1建立了到Broker-2的网络连接器以转发队列消息。 生产者将消息放入Broker-1上的队列foo.bar中
让我们看看这个动作
- 编辑Broker-1的配置/Users/akuntamukkala/apache-activemq-5.8.0/bridge-demo/broker-1/conf/activemq.xml并打开与Broker-2的网络连接器,然后重新启动Broker-1和Broker-2
<networkConnectors><networkConnectorname="T:broker1->broker2"uri="static:(tcp://localhost:61626)"duplex="false"decreaseNetworkConsumerPriority="false"networkTTL="2"dynamicOnly="true"><excludedDestinations><queue physicalName=">" /></excludedDestinations></networkConnector><networkConnectorname="Q:broker1->broker2"uri="static:(tcp://localhost:61626)"duplex="false"decreaseNetworkConsumerPriority="false"networkTTL="2"dynamicOnly="true"><excludedDestinations><topic physicalName=">" /></excludedDestinations></networkConnector></networkConnectors>
- 启动本地消费者,消费者1
Ashwinis-MacBook-Pro:example akuntamukkala$ ant consumer -Durl=tcp://localhost:61616 -Dtopic=false -Dsubject=foo.bar
- 启动远程使用者Consumer-2
Ashwinis-MacBook-Pro:example akuntamukkala$ ant consumer -Durl=tcp://localhost:61626 -Dtopic=false -Dsubject=foo.bar
- 在Broker-1上启动生产者以排队100条消息
Ashwinis-MacBook-Pro:example akuntamukkala$ ant producer -Durl=tcp://localhost:61616 -Dtopic=false -Dsubject=foo.bar -Dmax=100
屏幕截图显示了Broker-1的队列:
让我们看一下消费者,看看消息是如何被分离出来的。
您可能会注意到,ActiveMQ代理将消息均匀地分派给本地使用者,而不是远程使用者,从而赋予它们相同的优先级。
远程使用者Consumer-2仅距离代理1跳,其距离配置的networkTTL值2少。
这会导致路由选择欠佳,尤其是在连接了经纪人时,使得生产者和消费者之间可能有多种路由。 为了确保生产者和消费者之间的最短路径,最好将其分发给本地消费者,而不是偏远的消费者。
ActiveMQ提供了一种使用该属性在本地使用者和远程使用者之间配置优先级的方法
网络连接器上的reductionNetworkConsumerPriority。
默认情况下,此值为false,因此将本地和远程代理视为相同。
如果我们在更改了reduceNetworkConsumerPriority =“ true”之后重复上述步骤,那么我们发现本地消费者Consumer-1的优先级高于远程消费者Consumer-2,即距离中间商1的路程。
ActiveMQ可以智能地找出消息生产者和消费者之间的代理网络中的最短路径。
请阅读以下链接,以进一步了解ActiveMQ的最佳路由。
- http://fusesource.com/docs/esb/4.3/amq_clustering/Networks-OptimizingRoutes.htm l
至此,本系列文章的第3部分结束了,我们看到了如何区分本地和远程使用者以帮助ActiveMQ确定消息产生者和使用者之间的最佳路径。
一如既往地欢迎您提出意见。
请继续关注第4部分,我们将讨论远程并发使用方的负载平衡…
翻译自: https://www.javacodegeeks.com/2014/04/activemq-network-of-brokers-explained-part-3.html