【问题标题】:ActiveMQ Network of Brokers results in high message sending latencyActiveMQ 代理网络导致高消息发送延迟
【发布时间】:2013-07-01 18:02:33
【问题描述】:

长时间的监听,Stackoverflow 上的第一次调用 :)

我有一个带有生产者和消费者的 ActiveMQ 代理。生产者正在连接到一个 activeMQ 代理。有一个消费者连接到同一个代理。当我使用此设置 P -> B -> C 发送消息时,几乎没有延迟,并且消息以每条消息 8 毫秒的速率发送。

现在我添加另一个代理来创建代理网络并使用以下配置发送消息:P -> B1 -> B2 -> C 每条消息最多需要 80 毫秒。

附加信息:

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

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

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

我使用的是 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 需要 > 240 毫秒。这是 activemq.log 中的一些相关信息

2013-07-10 23:05:00,186 |追踪 |运行任务迭代 932 - 传输连接到:vm://broker1#0 | org.apache.activemq.thread.PooledTaskRunner:128 | ActiveMQ BrokerService[broker1] Task-3

2013-07-10 23:05:00,187 |调试 |桥接(broker1 -> broker2)ActiveMQBytesMessage {...} ActiveMQBytesMessage {...},消费者:ID:broker1-50755-1373522507018-2:1:1:2,目标主题://LogMessageTopic.Server.xxx.com , brokerPath: [ID:broker1-50755-1373522507018-0:1], 消息: ActiveMQBytesMessage {...} ActiveMQBytesMessage{ bytesOut = null, dataOut = null, dataIn = null } | org.apache.activemq.network.DemandForwardingBridgeSupport:974 | ActiveMQ BrokerService[broker1] Task-3

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

2013-07-10 23:05:00,439 |调试 |桥接(broker1 -> broker2)ActiveMQBytesMessage {...} ActiveMQBytesMessage{...},消费者:ID:broker1-50755-1373522507018-2:1:1:2,目标主题://LogMessageTopic.Server.xxx.com , brokerPath: [ID:broker1-50755-1373522507018-0:1], 消息: ActiveMQBytesMessage {...} ActiveMQBytesMessage{ bytesOut = null, dataOut = null, dataIn = null } | org.apache.activemq.network.DemandForwardingBridgeSupport:974 | ActiveMQ BrokerService[broker1] Task-3

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

2013-07-10 23:05:00,709 |调试 |桥接(broker1 -> broker2)ActiveMQBytesMessage {...} ActiveMQBytesMessage{...},消费者:ID:broker1-50755-1373522507018-2:1:1:2,目标主题://LogMessageTopic.Server.xxx.com , brokerPath: [ID:broker1-50755-1373522507018-0:1], 消息: ActiveMQBytesMessage {...} ActiveMQBytesMessage{ bytesOut = null, dataOut = null, dataIn = null } | org.apache.activemq.network.DemandForwardingBridgeSupport:974 | ActiveMQ BrokerService[broker1] Task-3

2013-07-10 23:05:00,962 |追踪 |运行任务迭代 935 - 传输连接到:vm://broker1#0 | org.apache.activemq.thread.PooledTaskRunner:128 | ActiveMQ BrokerService[broker1] Task-3

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

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

【问题讨论】:

  • 我有几个问题需要澄清:1)当您说“以每条消息 8 毫秒的速率发送”时,您的意思是每条消息的延迟为 8 毫秒,或者您每隔8毫秒? 2) 假设您的意思是 8 毫秒的延迟(因为您稍后会谈到 10 倍延迟增加)当 B1 和 C 之间存在 20-30 毫秒的延迟时,这怎么可能?请澄清。
  • SirRichie,1) 这是正确的。 P 和 B1 之间的延迟为 8ms。 2) DC1和DC2中B1和B2之间的延迟为20-30ms。
  • 我不太擅长阅读日志文件。据我所知,您使用 vm:// 作为传输协议?您绝对应该切换到 tcp:// ;也尝试发送 TextMessage 用于测试目的,而不是 ByteMessage;和问题:你如何衡量延迟?

标签: performance jms activemq


【解决方案1】:

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

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

消息代理网络不像常规网络那样透明。代理上的接收和分派机制通过消息存储有效地相互分离,消息存储在磁盘或内存中。每个代理都是生产者和消费者之间的一个站点。因此,在这方面,看到更高的延迟我并不感到惊讶。我喜欢这个比喻,就像一排人在通过一桶水。

请参阅Understanding ActiveMQ Broker Networks 了解更详细的说明。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 2017-02-13
    • 1970-01-01
    相关资源
    最近更新 更多