在前面的第4部分中,我们已经看到了如何使用网络连接器在队列中平衡远程使用者的负载。
在第5部分中,我们将看到如果在某个主题上有并发远程持久订阅者,则相同的配置将如何工作。 考虑以下配置…。
图1:经纪人网络–主题上的负载平衡订户 |
如上所示,我们有Broker-1,它启动了到Broker-2和Broker-3的两个网络连接器。 生产者将消息发送到Broker-1上的主题“ moo.bar”,而Broker-2具有订户C1,而Broker-3具有两个订户C2和C3,主题相同。
您可能会注意到,此设置与第4部分非常相似。 唯一的区别是,这里我们处理主题,而在第4部分中 ,我们处理队列。
让我们看看这个动作
- 在Broker-1的activemq.xml配置文件中添加以下网络连接器配置:
<networkConnectors> <networkConnector name="T:broker1->broker2" uri="static:(tcp://localhost:61626)" duplex="false" decreaseNetworkConsumerPriority="false" networkTTL="2" conduitSubscriptions="false" dynamicOnly="true"> <excludedDestinations> <queue physicalName=">" /> </excludedDestinations> </networkConnector> <networkConnector name="T:broker1->broker3" uri="static:(tcp://localhost:61636)" duplex="false" decreaseNetworkConsumerPriority="false" networkTTL="2" conduitSubscriptions="false" dynamicOnly="true"> <excludedDestinations> <queue physicalName=">" /> </excludedDestinations> </networkConnector> </networkConnectors>
- 让我们按此顺序启动broker-2,broker-3和broker-1。
akuntamukkala@localhost~/apache-activemq-5.8.0/cluster/broker-2/bin$ ./broker-2 console
akuntamukkala@localhost~/apache-activemq-5.8.0/cluster/broker-3/bin$ ./broker-3 console
akuntamukkala@localhost~/apache-activemq-5.8.0/cluster/broker-1/bin$ ./broker-1 console
- Broker-1的管理控制台连接显示,已经按照从Broker-1到Broker-2和Broker-3的配置分别建立了两个网络连接器:
-
Broker-1的连接@ http:// localhost:8161 / admin / connections.jsp - 让我们开始在Broker-2上订阅订户C1,订阅主题“ moo.bar”的消息,在Broker-3上订阅订户C2和C3,订阅同一主题“ moo.bar”的消息。
- 持久订户需要客户端ID和订户名称的唯一组合。 为了创建持久订户C2和C3,我们需要增强/Users/akuntamukkala/apache-activemq-5.8.0/example/src/ConsumerTool.java中提供的功能,其中/Users/akuntamukkala/apache-activemq-5.8 .0是ActiveMQ的安装目录。
- 修改后的代码包括编辑build.xml和ConsumerTool.java以添加新参数“ subscriberName”。 可以分别从此处和此处获取编辑后的文件build.xml和ConsumerTool.java。
- 现在开始订户。
akuntamukkala@localhost~/apache-activemq-5.8.0/example$ant consumer -Durl=tcp://localhost:61626 -Dtopic=true -Dsubject=moo.bar -DclientId=C1 -Ddurable=true -DsubscriberName=mb.C1
akuntamukkala@localhost~/apache-activemq-5.8.0/example$ant consumer -Durl=tcp://localhost:61636 -Dtopic=true -Dsubject=moo.bar -DclientId=C2 -Ddurable=true -DsubscriberName=mb.C2
akuntamukkala@localhost~/apache-activemq-5.8.0/example$ant consumer -Durl=tcp://localhost:61636 -Dtopic=true -Dsubject=moo.bar -DclientId=C3 -Ddurable=true -DsubscriberName=mb.C3
- Broker-2上的持久订阅者:
http:// localhost:9161 / admin / subscribers.jsp - Broker-3上的持久订阅者:
http:// localhost:10161 / admin / subscribers.jsp - Broker-1上的持久订户(由于网络连接器):
http:// localhost:8161 / admin / subscribers.jsp - 现在,让我们向Broker-1上的主题moo.bar发送10条持久消息。
akuntamukkala@localhost~/apache-activemq-5.8.0/example$ant producer -Durl=tcp://localhost:61616 -Dtopic=true -Dsubject=moo.bar -Dmax=10 -Ddurable=true
- 请参阅Broker-3上的控制台:
Broker-3上的日志文件输出 - 如您所见,Broker-3收到两次相同的消息,每个订阅C2和C3一次。 默认情况下,ActiveMQ不允许处理重复的消息。
- 发生这种情况是因为Broker-3上的订阅mb.C2和mb.C3都传播到了Broker-1。 因此,当10条消息发布到Broker-1上的moo.bar时,这些消息将发送到同一代理:Broker-3上的订户mb.C2和mb.C3。 由于消息具有相同的ID,因此重复消息将被丢弃,因此警告将显示在日志消息中……(如步骤19所示)。
- 这是显示关于Broker-1的统计信息的控制台:
http:// localhost:8161 / admin / subscribers.jsp - 这是显示关于Broker-3的统计信息的控制台:
http:// localhost:10161 / admin / subscribers.jsp - 如您所见,即使入队计数器显示为20,出队计数器也仅显示10,因为其他10条消息已由Broker-3丢弃。 这是一项有用的功能,有助于确保代理最多处理一次消息。
发生这种情况的原因是,预订C2和C3都传播到上游代理Broker-1。
Broker-3上的重复消息 |
让我们在网络连接器设置中进行细微调整来重试相同的场景,方法是将pipelineSubscriptions =“ true”
在两个网络连接器上分别从Broker-1到Broker-2和Broker-3。 重新启动代理后,删除不活动的持久订阅者,然后重复上述步骤。
<networkConnectors>
<networkConnector
name="T:broker1->broker2"
uri="static:(tcp://localhost:61626)"
duplex="false"
decreaseNetworkConsumerPriority="false"
networkTTL="2"
conduitSubscriptions="true"
dynamicOnly="true">
<excludedDestinations>
<queue physicalName=">" />
</excludedDestinations>
</networkConnector>
<networkConnector
name="T:broker1->broker3"
uri="static:(tcp://localhost:61636)"
duplex="false"
decreaseNetworkConsumerPriority="false"
networkTTL="2"
conduitSubscriptions="true"
dynamicOnly="true">
<excludedDestinations>
<queue physicalName=">" />
</excludedDestinations>
</networkConnector>
</networkConnectors>
下面的屏幕快照显示,Broker-1现在仅看到两个持久性订户,每个Broker-1和Broker-3中都有一个。
当conductorSubscriptions =“ true”时,Broker-1中的持久订户 |
在Broker-1上发布10条持久消息后,我们发现这次没有相同的重复消息问题。
正如预期的那样,所有10条消息均由C1,C2和C3处理,如下面的屏幕快照所示。
Broker-1的持久主题订阅者 |
Broker-3的持久主题订户C2和C3分别接收和处理10条消息 |
因此,我们已经了解了如何通过避免在代理网络中重复发送消息来帮助管道订阅属性来减少消息流量。
在第6部分中,我们将看到ActiveMQ如何提供“消息重播”功能以防止消息阻塞的情况。
翻译自: https://www.javacodegeeks.com/2014/06/activemq-network-of-brokers-explained-part-5.html