Activemq虚拟主题订阅在代理网络中的传播原理



谁能解释一下activemq虚拟主题在网络经纪人中的行为?我对订阅传播有一个困惑。

例如,有一个代理与另一个代理具有网络连接。假设代理mq001对代理mq002打开了以下网络连接器:

<networkConnectors>
            <networkConnector name="connectorToRemoteBroker" uri="static:(tcp://mq002:61616)?maxReconnectAttempts=0" duplex="false"                networkTTL="3" decreaseNetworkConsumerPriority="true">
</networkConnectors>

然后我运行消费者(A)到代理mq001上的虚拟主题:endpointURI: activemq:Consumer.A.VirtualTopic.tempTopic

我可以注意到activemq控制台中一些有趣的行为。首先,没有主题"VirtualTopic.tempTopic"创建。然而,有一个队列(虚拟主题的底层物理队列)可用——Consumer.A.VirtualTopic.tempTopic此队列有一个活动的本地消费者。

然后我启动另一个消费者(B)到相同的虚拟主题,但已经在代理2 (mq002)上。

endpointURI - activemq:Consumer.B.VirtualTopic.tempTopic

如果我现在看一下代理上的activemq控制台2。我仍然没有看到任何可用的虚拟主题。还创建了另一个物理队列consumer . b . virtualtopic . temptopic,该队列有一个活动消费者(对于mq002来说也是本地的)。

当我查看broker one上的控制台时,我现在看到两个队列:

Consumer.A.VirtualTopic。tempTopic -具有活跃的本地消费者consumer. b . virtualtopic . temptopic -带有一个活动的远程消费者。

所以订阅传播至少在物理队列级别上工作。因为它不是双工,所以只能在mq002到mq001之间工作。

然后我发布消息到主题:

 activemq:topic:VirtualTopic.tempTopic

它被mq001和mq002上的消费者同时使用。此外,在activemq控制台(VirtualTopic.tempTopic)中最后有一个可用的主题。

所以每个消费者只消费一条消息。如果我用更多的消息重复它,它仍然是一样的。没有收到重复的邮件,也没有丢失的邮件。每个物理队列上排队的消息数与虚拟主题上的消息数相匹配。

这正是我所期望的在代理网络中虚拟主题的行为。

但现在让我困惑的是:

http://activemq.apache.org/virtual-destinations.html VirtualDestinations-AvoidingDuplicateMessageinaNetworkofBrokers

如果使用默认值,很可能会得到重复的消息网络配置。这是因为一个网络节点不仅会转发消息发送到虚拟主题,还可以关联物理队列。

首先,我没有看到任何重复,它工作得很好。但是,如果我按照建议禁用物理队列目的地,会发生什么情况呢?

<networkConnectors>
            <networkConnector name="connectorToRemoteBroker" uri="static:(tcp://mq002:61616)?maxReconnectAttempts=0" duplex="false" networkTTL="3" decreaseNetworkConsumerPriority="true">
                <excludedDestinations>
                        <queue physicalName="Consumer.*.VirtualTopic.>"/>
                </excludedDestinations>
          </networkConnector>
        </networkConnectors> 

然后,当我启动消费者时,我没有看到远程消费者不再监听物理队列消费者。B在代理mq001上。如果我向虚拟主题发布消息,那么它将被Consumer消费。A(本地)。因此,看起来虚拟主题的订阅传播被忽略,只在物理队列上工作。

在我看来activemq文档有点过时了。有人能证实或反驳吗?

提前感谢!

所以你上面的测试是正确的。我刚刚更新了文档,指定您可以在使用传统主题订阅者和虚拟主题订阅者通过网络到同一目的地时获得dup。这意味着,在您的示例中,如果我有一个"VirtualTopic"的主题订阅者。mq002上的"tempTopic"以及一个消费者队列"consumer . b . virtualtopic"。tempTopic",那么我就可以以dup结尾了。希望这能澄清问题。如果你只使用基于队列的订阅者,那么不要排除基于队列的需求转发。

我写了一个单元测试,你可以在这里看一下:

http://svn.apache.org/viewvc/activemq/trunk/activemq-unit-tests/src/test/java/org/apache/activemq/usecases/TwoBrokerVirtualTopicForwardingTest.java?view=markup

最新更新