使用Hornetq核心桥的吞吐量非常低
-
13-12-2019 - |
题
我们正在尝试使用HornetQ商店和转发机制...但是从一个独立的Hornetq实例转发消息到另一个核心桥的另一个是非常慢的。我们还无法将吞吐率提高200次以上200次邮件。
令人惊讶的事实是,如果直接在目标Hornetq实例中将相同的客户端(将消息发布到转发HorneTQ实例),我们开始观察每秒超过1000条消息的吞吐率(此客户端是基于JMS的)。这基本上意味着在转发HornetQ实例和目标HornetQ实例之间配置的核心桥是有问题的。以下是用于在转发HornetQ上配置核心桥的相关部分:
<connectors>
<connector name="netty-bridge">
<factory-class>org.hornetq.core.remoting.impl.netty.NettyConnectorFactory</factory-class>
<param key="host" value="destination.xxx.com"/>
<param key="port" value="5445"/>
<param key="batch-delay" value="50"/>
<param key="tcp-send-buffer-size" value="1048576"/>
<param key="tcp-receive-buffer-size" value="1048576"/>
<param key="use-nio" value="true"/>
</connector>
</connectors>
<address-settings>
<address-setting match="jms.queue.Record">
<dead-letter-address>jms.queue.RecordDLQ</dead-letter-address>
<max-size-bytes>262144000</max-size-bytes>
<page-size-bytes>10485760</page-size-bytes>
<address-full-policy>PAGE</address-full-policy>
</address-setting>
</address-settings>
<queues>
<queue name="jms.queue.Record">
<address>jms.queue.Record</address>
</queue>
</queues>
<bridges>
<bridge name="core-bridge">
<queue-name>jms.queue.Record</queue-name>
<forwarding-address>jms.queue.Record</forwarding-address>
<retry-interval>1000</retry-interval>
<retry-interval-multiplier>1.0</retry-interval-multiplier>
<reconnect-attempts>-1</reconnect-attempts>
<confirmation-window-size>10485760</confirmation-window-size>
<static-connectors>
<connector-ref>netty-bridge</connector-ref>
</static-connectors>
</bridge>
</bridges>
.
以下是用于在目标HornetQ上配置核心桥的相关部分:
<acceptors>
<acceptor name="netty">
<factory-class>org.hornetq.core.remoting.impl.netty.NettyAcceptorFactory</factory-class>
<param key="host" value="${hornetq.remoting.netty.host:192.168.2.xxx}"/>
<param key="port" value="${hornetq.remoting.netty.port:xxxx}"/>
<param key="tcp-send-buffer-size" value="1048576"/>
<param key="tcp-receive-buffer-size" value="1048576"/>
<param key="use-nio" value="true"/>
<param key="batch-delay" value="50"/>
<param key="use-nio" value="true"/>
</acceptor>
<acceptors>
<address-settings>
<address-setting match="jms.queue.Record">
<dead-letter-address>jms.queue.RecordDLQ</dead-letter-address>
<max-size-bytes>262144000</max-size-bytes>
<page-size-bytes>10485760</page-size-bytes>
<address-full-policy>PAGE</address-full-policy>
</address-setting>
</address-settings>
<queues>
<queue name="jms.queue.Record">
<address>jms.queue.Record</address>
</queue>
</queues>
.
所有系统变量(CPU /内存/磁盘IO /网络/ etc。)未结束,日志中没有错误。
note :我们尝试过nio以及遗留/旧的io。这两次尝试了HornetQ-2.2.5-Final和HornetQ-2.2.8-Ga(2.2.8-Ga由源代码建造)
对可能导致这个问题的任何想法以及分辨率可能是什么?
其他观察:看起来它是通过核心桥发送的消息是交易的......所以可以批量这些交易,并且在两个角质实例之间发生通信是异步的?
解决方案
当转发HornetQ创建桥时,它内部仅使用一个线程来发送桥梁的消息,并仅打开到目标HornetQ的一个连接。因此,它无法利用多个处理器,并且也受到网络(延迟/带宽/ RTT)的限制,并且不能有效地平行地发送消息的发送。因此,如果您有高吞吐量,则开始击中盖帽(在我们的情况下每秒大约200条消息)。您可以通过调整HornetQ连接器和受护者参数(如TCP发送和接收缓冲区)和桥接设置(确认窗口大小)来增加这一点,但这只能带走你这么长时间(我们将吞吐量高达约300条邮件)每秒)。
解决方案 - 在同一对转发和目标HornetQ实例(涉及相同的队列)之间创建多个桥接器。这有效地平行于消息的转移,从而提高了吞吐量。创建三个桥几乎将吞吐量增加将吞吐量增加到每秒870条消息。
jboss需要理想地使该并行化在核心桥中可配置。
其他提示
我相信你使用的是2.2.5(从你的帖子中没有清楚你使用的版本)在桥上有一个错误,导致你所说的问题。
在某些版本中,桥接桥正在同步发送消息,而不是在异步确认上计算。
看看它如何在最新版本上表现。