在前面的第3部分中 ,我们已经看到ActiveMQ如何帮助将远程使用者与本地使用者区分开来,这有助于确定从消息生产者到使用者的较短路径。
在第4部分中,我们将研究如何在远程代理上负载均衡并发使用者。
让我们考虑一些高级配置,以平衡远程代理中队列上的并发消息使用者,如下所示。
第四部分–经纪人网络 |
在以上配置中,我们有一个消息生成器,将消息发送到Broker-1上的队列moo.bar中。 Broker-1建立到Broker-2和Broker-3的网络连接器。 消费者C1使用来自代理2上队列moo.bar的消息,而消费者C2和C3是代理3上队列moo.bar上的并发消费者。
让我们看看这个动作
让我们创建三个经纪人实例…
- Ashwinis-MacBook-Pro:bin akuntamukkala $ pwd / Users / akuntamukkala / apache-activemq-5.8.0 / bin
- Ashwinis-MacBook-Pro:bin akuntamukkala $。/ activemq-admin创建../cluster/broker-1
- Ashwinis-MacBook-Pro:bin akuntamukkala $。/ activemq-admin创建../cluster/broker-2
- Ashwinis-MacBook-Pro:bin akuntamukkala $。/ activemq-admin创建../cluster/broker-3
- 通过修改相应的conf / activemq.xml和conf / jetty.xml来修复broker-2和broker-3传输,amqp连接器和jetty http端口,如下所示:
经纪人 Openwire端口 码头HTTP端口 AMQP端口 经纪人1 61616 8161 5672 经纪人2 61626 9161 5682 经纪人3 61636 10161 5692 - 修复broker-1上的网络连接器,以便可以将队列中的消息动态转发给broker-2和broker-3上的使用者。 可以通过将以下XML代码段添加到broker-1的conf / activemq.xml中来完成此操作
<networkConnectors><networkConnectorname="Q:broker1->broker2"uri="static:(tcp://localhost:61626)"duplex="false"decreaseNetworkConsumerPriority="true"networkTTL="2"dynamicOnly="true"><excludedDestinations><topic physicalName=">" /></excludedDestinations></networkConnector>
<networkConnectorname="Q:broker1->broker3"uri="static:(tcp://localhost:61636)"duplex="false"decreaseNetworkConsumerPriority="true"networkTTL="2"dynamicOnly="true"><excludedDestinations><topic physicalName=">" /></excludedDestinations></networkConnector></networkConnectors>
- 启动broker-2,broker-3和broker-1。 我们可以按任何顺序启动它们。
- /apache-activemq-5.8.0/cluster/broker-3/bin$ ./broker-3控制台
- /apache-activemq-5.8.0/cluster/broker-2/bin$ ./broker-2控制台
- /apache-activemq-5.8.0/cluster/broker-1/bin$ ./broker-1控制台
- 让我们在代理2上启动使用者C1,在代理3上启动消费者C2,在代理3上启动C3,但在称为“ moo.bar”的同一队列中
- /apache-activemq-5.8.0/example$ ant消费者-Durl = tcp:// localhost:61626 -Dsubject = moo.bar
- /apache-activemq-5.8.0/example$ ant消费者-Durl = tcp:// localhost:61636 -Dsubject = moo.bar -DparallelThreads = 2
消费者订阅由Broker-2和Broker-3转发到其相邻的Broker-1,后者通过使用咨询消息将网络连接器同时建立到Broker-2和Broker-3。
- 让我们回顾一下代理Web控制台以查看队列和相应的使用者。
- 我们发现broker-2的Web控制台显示一个队列“ moo.bar”有1个使用者,broker-3的Web控制台显示一个队列“ moo.bar”有2个并发使用者
- 尽管有三个消费者(代理2上的C1和代理3上的C2,C3),但是代理1仅看到两个消费者(分别代表代理2和代理3)。
http:// localhost:8161 / admin / queues.jsp
这是因为默认情况下,从broker-1到broker-2以及到broker-3的网络连接器都具有“ conduitSubscriptions”属性。
由于哪个代理3的C2和C3消耗了来自同一队列“ moo.bar”的消息,因此在代理1中被视为一个使用方。
- 让我们将30条消息生成到broker-1的队列moo.bar中,并查看消息如何在使用者C1,C2和C3之间分配:
显示消息如何从生产者传播到消费者C1,C2,C3
如上所示,即使有3个使用者和30条消息,但由于C2,C3订阅被合并到Broker-1的一个使用者中,因此每个人都无法处理10条消息。
如果我们要在主题上创建订户,则该管道将成为有用的设置,因为这样可以防止出现重复消息。 在第5部分中将对此进行更多介绍。
因此,为了使队列moo.bar上的C2和C3订阅传播到broker-1,让我们在broker-1的网络连接器配置中将conductorSubscriptions =“ false”设置为6之后,重新执行相同的步骤6、7、8、9和10。 conf / activemq.xml。
这是Broker-1的新网络连接器配置代码段:
<networkConnectors><networkConnectorname="Q:broker1->broker2"uri="static:(tcp://localhost:61626)"duplex="false"decreaseNetworkConsumerPriority="true"networkTTL="2"conduitSubscriptions="false"dynamicOnly="true"><excludedDestinations><topic physicalName=">" /></excludedDestinations></networkConnector><networkConnectorname="Q:broker1->broker3"uri="static:(tcp://localhost:61636)"duplex="false"decreaseNetworkConsumerPriority="true"networkTTL="2"conduitSubscriptions="false"dynamicOnly="true"><excludedDestinations><topic physicalName=">" /></excludedDestinations></networkConnector>
</networkConnectors>
重新启动代理和使用者C1,C2和C3并在Broker-1的moo.bar队列中产生30条消息后,我们发现所有三个使用者订阅都在Broker-1上可见。 结果,broker-1以循环方式向每个使用者分发了10条消息,以实现负载平衡。 如下图所示。
显示消息如何从生产者传播到消费者C1,C2,C3 |
Broker-1的Web控制台@http:// localhost:8161 / admin / queueConsumers.jsp?JMSDestination = moo.bar显示,Broker-1现在可以看到3个使用者,并向每个使用者发送10条消息。
因此,在博客系列的第4部分中,我们已经了解了如何平衡正在使用队列中消息的远程并发使用者。
一如既往地感谢您的意见和反馈!
在第5部分中,我们将探讨如果我们使用主题而不是队列来播放相同的场景。 敬请关注…
资源资源
- http://fusesource.com/docs/esb/4.3/amq_clustering/Networks-Connectors.html
- 此博客中使用的所有代理的配置文件(activemq.xml和jetty.xml)在此处可用。
翻译自: https://www.javacodegeeks.com/2014/06/activemq-network-of-brokers-explained-part-4.html