当前位置: 首页 > 知识库问答 >
问题:

ActiveMQ不在代理之间分发消息

子车心思
2023-03-14

我在完整图形拓扑上有一个代理网络,在不同服务器上有3个节点:A,B和C。每个代理都附加了一个生产者,并且出于测试目的,在代理 C 上只有一个非代理使用者。由于我使用的是完整图拓扑,因此每个代理还为其他每个节点都有一个代理使用者。

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

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

我正在使用ActiveMQ 5.9.0。

这是我对经纪人A的活跃.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>

共有1个答案

司空温书
2023-03-14

默认情况下,networkTTL 为 1(请参阅文档),因此,当 B 上的创建者发布消息时,如果它采用路径到 A(它将在您的配置中执行 50% 的时间,因为您已将代理设置为使用者之间的轮循机制,稍后会详细介绍),则不允许将其转发到 C。您可以通过增加网络TTL的值来解决此问题,但更好的解决方案是设置 reduceNetworkConsumerPriority=true(请参阅与上面相同的链接中的文档),以确保消息始终尽可能直接地发送给它们所针对的使用者。

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

 类似资料:
  • 刚刚浏览了这些文档: < Li > http://ActiveMQ . Apache . org/failover-transport-reference . html 那么,是否有可能配置消费者和生产者应用程序来连接和平衡多个代理实例之间的负载(以循环或类似的方式)?

  • 我试图通过Apache Camel在两个ActiveMQ代理之间传输消息,但问题是我只能达到每秒135条消息的传输速率。我想增加这个数字。情况是远程服务器上有2个ActiveMQ代理。我想从第一个代理上的队列获取消息,并通过骆驼路由将这些消息传送到第二个代理上的多个队列。 我的路由: ps:顺便说一句,ping远程服务器~2ms

  • 我们需要将消息从一个ActiveMQ代理复制到另一个代理。这里消息必须只是复制,并且消息应该存在于两个代理中。 我可以想到一个自定义应用程序,它订阅某个目标并读取该消息并将消息重新发布到多个代理中的目标。 我没有权限在经纪人中进行更改,所以我想不出经纪人网络选项。 是否有任何最佳实践或工具可用于将A-MQ消息从一个代理复制到另一个代理?

  • 我有一个Kafka主题,目前有3个分区。我希望我的消费者从同一个分区读取,但每条消息都应该以循环方式发送给不同的消费者。有可能实现吗?

  • 我使用网络连接器配置了两个代理 A 和 B。如果我使用独占使用者(单个使用者)或消息组(JMXgroupID),消息顺序是否保留? 在经纪人文档的网络中,我发现: 代理网络不会保留总消息排序。总排序适用于单个使用者,但网络桥引入第二个使用者。此外,网络桥接使用者通过 producer.send(..) 转发消息,因此它们从转发代理上的队列头转到目标上队列的尾部。如果单个使用者在联网代理之间移动,则

  • 我有两个具有双工网桥配置的代理。有时会出现以下情况:代理之间存在连接,从代理B到代理a的消息正常转发。但不从代理A转发到代理B。重新启动代理B时,将发送所有消息。日志中没有错误。ActiveMQ版本5.10。 代理 A 的配置: 经纪商B配置: 如何制作可靠的双工桥?