【问题标题】:How Activemq Virtual topic subscription propagation in Network of brokers works?代理网络中的 Activemq 虚拟主题订阅传播如何工作?
【发布时间】:2013-05-29 14:19:15
【问题描述】:

有人可以在代理网络的上下文中澄清 activemq 虚拟主题的行为吗? 我对订阅传播感到困惑。

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

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

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

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

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

endpointURI - activemq:Consumer.B.VirtualTopic.tempTopic

如果我现在看一下代理 2 上的 activemq 控制台。我仍然没有看到任何可用的虚拟主题。有另一个创建的物理队列 Consumer.B.VirtualTopic.tempTopic 有一个活动的消费者(对于 mq002 也是本地的)。

当我查看代理一号上的控制台时,我现在看到两个队列:

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> 

然后当我启动消费者时,我看不到远程消费者正在监听代理 mq001 上的物理队列 Consumer.B。如果我向虚拟主题发布消息,则它仅由 Consumer.A (本地)使用。所以看起来订阅传播对于虚拟主题被忽略并且只在物理队列上工作。

在我看来,activemq 文档有点过时了。有人可以确认或反驳吗?

提前致谢!

【问题讨论】:

    标签: activemq broker jms-topic


    【解决方案1】:

    所以你上面的测试是正确的。 我刚刚更新了文档以指定您可以在通过网络使用传统主题订阅者和虚拟主题订阅者到同一目的地时获得副本。这意味着,在您的示例中,如果我在 mq002 上有一个“VirtualTopic.tempTopic”的主题订阅者以及一个将“Consumer.B.VirtualTopic.tempTopic”排队的消费者,那么我最终可能会遇到重复。希望这可以解决问题。如果您仅使用基于队列的订阅者,则不要排除基于队列的需求转发。

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

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

    【讨论】:

    • 非常感谢,我现在完全清楚了。单元测试看起来很棒,也很有帮助。
    • @ceposta - 我正在尝试使用网络代理设置切换我们当前的共享存储主从设置。我们大量使用虚拟主题 - 您的上述答案是否意味着无法让虚拟主题在网络经纪人之间按预期行事?允许任何一个代理上的主题消费者和/或虚拟主题队列消费者?似乎无论我选择什么设置(不包括主题或不包括 v.queues),我都会得到一些不受欢迎的行为。
    猜你喜欢
    • 2012-02-03
    • 1970-01-01
    • 2015-11-28
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    • 2021-03-02
    • 1970-01-01
    相关资源
    最近更新 更多