1

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

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

现在我添加另一个代理来创建代理网络并使用以下配置发送消息: 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 每条消息需要 > 240 毫秒。这是 activemq.log 中的一些相关信息

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

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

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

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

似乎经纪人到经纪人的数据传输需要很长时间。

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

4

1 回答 1

1

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

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

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

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

于 2013-07-12T09:05:27.950 回答