【问题标题】:ActiveMQ not distributing messages between brokersActiveMQ 不在代理之间分发消息
【发布时间】:2015-03-14 11:18:04
【问题描述】:

我在 Complete Graph 拓扑上有一个代理网络,在不同的服务器上有 3 个节点:A、B 和 C。每个代理都附加了一个生产者,并且出于测试目的,代理 C 上只有一个非代理消费者。我正在使用 Complete Graph 拓扑,每个代理还为每个其他节点都有一个代理消费者。

问题是:A 收到了一些消息。我希望它将这些消息转发给代理 C,它附加了一个“真正的”消费者。这不会发生,代理 A 会存储这些消息,直到“真正的”消费者连接到它。

我的配置(或理解)有什么问题?

我正在使用 ActiveMQ 5.9.0。

这是代理 A 的 activemq.xml。B 和 C 相同,只是更改名称:

<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd">

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="broker-A" dataDirectory="${activemq.data}">

    <destinationPolicy>
        <policyMap>
            <policyEntries>
                <policyEntry topic="tokio.>">
                    <subscriptionRecoveryPolicy>
                        <noSubscriptionRecoveryPolicy/>
                    </subscriptionRecoveryPolicy>
                    <pendingMessageLimitStrategy>
                        <constantPendingMessageLimitStrategy limit="1000"/>
                    </pendingMessageLimitStrategy>
                </policyEntry>
            </policyEntries>
        </policyMap>
    </destinationPolicy>

    <managementContext>
        <managementContext createConnector="true"/>
    </managementContext>

    <persistenceAdapter>
        <kahaDB directory="${activemq.data}/kahadb"/>
    </persistenceAdapter>

    <systemUsage>
        <systemUsage>
            <memoryUsage>
                <memoryUsage percentOfJvmHeap="70" />
            </memoryUsage>
            <storeUsage>
                <storeUsage limit="40 gb"/>
            </storeUsage>
            <tempUsage>
                <tempUsage limit="10 gb"/>
            </tempUsage>
        </systemUsage>
    </systemUsage>

    <networkConnectors>
        <networkConnector name="linkTo-broker-B"
                          uri="static:(tcp://SRVMSG01:61616)"
                          duplex="true"
                />
        <networkConnector name="linkTo-broker-C"
                          uri="static:(tcp://SRVMSG03:61616)"
                          duplex="true"
                />
    </networkConnectors>

    <transportConnectors>
        <transportConnector uri="tcp://localhost:0" discoveryUri="multicast://default"/>
        <transportConnector name="nio" uri="nio://0.0.0.0:61616" />
    </transportConnectors>

</broker>

</beans>

【问题讨论】:

    标签: jms activemq


    【解决方案1】:

    默认情况下,networkTTL 为 1(请参阅documentation),因此当 B 上的生产者发布消息时,如果它采用到 A 的路径(它会在您的配置中执行 50% 的时间,因为您'已将代理设置为消费者之间的循环,稍后再介绍),不允许将其转发给 C。您可以通过增加 networkTTL 的值来解决问题,但更好的解决方案是设置decreaseNetworkConsumerPriority=true(请参阅与上述相同链接的文档)以确保消息始终尽可能直接地发送到它们的目的地。

    但是请注意,如果您的消费者在网格中移动,这可能会使消息搁置,因为networkTTL 值不允许额外转发,并且因为不允许将消息重新发送到他们通过的代理“已经过去了。您可以通过将networkTTL 设置为更大的值(如20,以确保完全安全)并应用同一文档页面的“卡住消息”部分中描述的replayWhenNoConsumers=true 策略设置来解决这些问题。这些设置都不是绝对必要的,只要您确定您的消费者永远不会转移到另一个代理,或者当它发生时您可以丢失一些消息。

    【讨论】:

    • 仅此一项是行不通的。我还必须通过将队列添加为 dynamicIncludedDestinations 来指定如何通过代理进行传播。
    • 我将“A 收到一些消息”解释为表示一些消息被转发给 A,但并非所有消息都被转发(其余的都成功发送给 C),所以我没有甚至不要考虑您可能不会转发 任何 消息。我很高兴你想出了解决方案。
    猜你喜欢
    • 2015-10-28
    • 2013-03-10
    • 1970-01-01
    • 2018-03-01
    • 2021-12-05
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 2015-03-19
    相关资源
    最近更新 更多