ActiveMQ经纪人网络导致高消息发送延迟

时间:2013-07-03 21:19:34

标签: performance jms activemq

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

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

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

其他信息:

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正在进行&gt;每封邮件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 - &gt; 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 - &gt; 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 - &gt; 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 个答案:

答案 0 :(得分:1)

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

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

消息代理网络的透明方式与常规网络不同。代理上的接收和分派机制通过消息存储器有效地彼此分离,消息存储器位于磁盘上或内存中。每个经纪人都是生产者和消费者之间的途径。所以在这方面我看到更高的延迟并不奇怪。我喜欢这样的比喻,就好像是一排人经过一桶水。

有关更详细的说明,请参阅Understanding ActiveMQ Broker Networks