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

活跃的 MQ 代理网络导致高消息发送延迟

易弘阔
2023-03-14

长时间侦听者,堆栈溢出:)上的首次调用者

我有一个具有生产者和消费者的ActiveMQ代理。创建器正在连接到活动 MQ 代理。有一个使用者附加到同一个代理。当我使用此设置发送消息 P -

现在我添加另一个代理来创建代理网络,并使用以下配置发送消息:P-

附加信息:

P和B1在同一个数据中心,DC1。

B2 和 C 位于同一数据中心 DC2 中。

DC1和DC2是同一海岸上的两个不同数据中心,ping延迟约为20-30ms。

我使用的是activemq tarball附带的默认配置。我添加的唯一配置是连接代理以创建代理网络。

在B1上,我向activemq.xml添加了以下配置:

<networkConnectors>
</networkConnectors>

在B2上,我向activemq.xml添加了以下配置

<networkConnectors>
            <networkConnector name="B2" uri="static://(tcp://b1.prod.xxx.com:61616)" duplex="true"/>
</networkConnectors>

它是全双工连接,B2位于防火墙后面,因此如宣传的那样工作。

任何想法,为什么延迟增加了这么多。10倍的延迟是不可接受的。当生产者数量增加时,情况可能会更糟。

我做错什么了吗?

编辑:

我看到将消息从 B1 发送到 B2 正在占用

2013-07-10 23:05:00186|TRACE|运行任务迭代932-传输连接到:vm://broker135;0|.org.apache.activemq.thread。PooledTaskRunner:128|ActiveMQ代理服务[broker1]任务-3

2013-07-10 23:05:00,187|调试|桥接(经纪1-

2013-07-10 23:05:00,438 |跟踪|正在运行任务迭代 933 - 传输连接到:vm://broker1#0 |org.apache.activemq.thread.PooledTaskRunner:128 |ActiveMQ 代理服务[代理 1] 任务-3

2013-07-10 23:05:00,439|调试|桥接(经纪1-

2013-07-10 23:05:00,708|TRACE|正在运行的任务迭代934-传输连接到:vm://Broker1#0|org.apache.activemq.thread.PooledTaskRunner:128|ActiveMQ BrokerService[Broker1]Task-3

调试|桥接(代理1 -

2013-07-10 23:05:00962|TRACE|运行任务迭代935-传输连接到:vm://broker135;0|.org.apache.activemq.thread。PooledTaskRunner:128|ActiveMQ代理服务[broker1]任务-3

代理到代理的数据传输似乎需要很长时间。

我尝试设置persistent=false并使用KahaDB删除,但没有成功。

共有1个答案

易淳
2023-03-14

你所看到的是代理网络中存储转发的效果。当你从P发送消息时,它是:

  • 存储在 B1 中,并在发送时确认给 P。
  • 然后 B1 将其转发给 B2,后者存储它并确认给 B1;B1 从其本地存储中删除邮件。
  • 然后,B2 将消息转发给 C。当 C 使用它时,它会向 B2 确认消息,B2 会从其本地存储中删除该消息。

消息代理网络与常规网络不透明的方式不同。代理上的接收和调度机制实际上由消息存储库彼此分离,该消息存储库位于磁盘上或内存中。每个经纪人都是生产者和消费者之间途中的一个站点。因此,在这方面,看到更高的延迟,我并不感到惊讶。我喜欢这个比喻,它就像一群人经过一桶水。

有关更详细的说明,请参阅了解 ActiveMQ 代理网络。

 类似资料:
  • 我有两个 ActiveMQ 代理(A 和 B),它们被配置为存储转发网络。当代理 B 上连接了使用者并且创建者将消息发送到 A 时,它们可以完美地将消息从 A 转发到 B。问题在于,当使用者被杀死并重新连接到 A 时,B 上排队的消息(它们是从 A 转发的)不会转发回使用者连接到的 A。即使我向 B 发送新消息,所有消息都卡在 B 上,直到我重新启动代理。我尝试在代理网络连接器上设置网络TTL=“

  • 我们设置了一个中心辐射型拓扑,其中包含两个用于冗余的集线器。连接到网络的所有节点都具有到两个集线器的静态网络连接。 如果我们为另一个辐条产生的特定主题提供一个消费者,然后放弃其中一个集线器,有时消费者会停止获取数据。如果关闭hub A导致消费者停止接收数据,则进行备份将恢复消费者的订阅源。降低B对饲料没有影响。哪个枢纽可能影响消费者,这似乎是不一致的。 我们期望,对于代理网络,只要生产者在网络上并

  • 我在网络设置中有两个ActiveMQ代理。客户端配置为randomize=true,并且能够良好连接。但是,消息不会从一个代理转发到另一个代理,而是保留在队列中。例如,我有一个特定的队列,它有多个生产者和一个消费者。如果我查看一个消费者连接到的代理上的队列,所有消息都会立即退出队列。但是,在另一个代理上,消息会排队,不会被排出。 下面列出的是我为两个代理设置的网络连接器和传输连接器。我尝试过添加双

  • 我是使用ActiveMQ的新手,正在试图理解经纪人网络是如何工作的。我已经阅读了activemq文档,并浏览了互联网上的一些文章,如http://www . jakubkorab . net/2011/11/understanding-ActiveMQ-broker-networks . html 我在本地Windows桌面上设置了以下内容。有2台tomcat服务器分别运行在8080和9080上,

  • 我有两个ActiveMQ代理(A和B),它们被配置为具有静态列表的代理网络集群。 正常的消息消耗和存储转发按预期工作。也就是说:连接到代理B的消费者将拾取A上未连接消费者的消息。 我确实看到,咨询信息并非如此。在我当前的设置中,我有一个应用程序通过连接到advisory来监控DLQ:。当消息到达DLQ时,我需要它来触发某些操作。 在测试集群时,我没有看到任何针对代理A上的DLQ消息的建议消息传到我

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