【发布时间】: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