Messaging 使用HornetQ核心网桥的吞吐量非常低

Messaging 使用HornetQ核心网桥的吞吐量非常低,messaging,core,hornetq,throughput,Messaging,Core,Hornetq,Throughput,我们正在尝试使用HornetQ存储转发机制。。。但是,使用核心网桥将消息从一个独立的HornetQ实例转发到另一个实例非常慢。我们无法将吞吐量提高到每秒200条以上 令人惊讶的事实是,如果我们将同一个客户端(向转发HornetQ实例发布消息)直接指向目标HornetQ实例,我们开始观察到每秒超过1000条消息的吞吐量(该客户端基于JMS)。这基本上意味着在转发HornetQ实例和目标HornetQ实例之间配置的核心网桥存在问题 以下是在转发HornetQ上配置核心网桥的相关章节: <con

我们正在尝试使用HornetQ存储转发机制。。。但是,使用核心网桥将消息从一个独立的HornetQ实例转发到另一个实例非常慢。我们无法将吞吐量提高到每秒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>

org.hornetq.core.remoting.impl.netty.NettyConnectorFactory
jms.queue.RecordDLQ
262144000
10485760
页
jms.queue.Record
jms.queue.Record
jms.queue.Record
1000
1
-1
10485760
网桥
以下是在目标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>

org.hornetq.core.remoting.impl.netty.NettyAcceptorFactory
jms.queue.RecordDLQ
262144000
10485760
页
jms.queue.Record
所有系统变量(CPU/内存/磁盘IO/网络等)都未充分利用,日志中没有错误

注意:我们已经尝试了NIO和遗留/旧IO。这已经在HornetQ-2.2.5-Final和HornetQ-2.2.8-GA中试用过(2.2.8-GA是从源代码构建的)

你知道是什么导致了这个问题,解决方案是什么吗


其他观察结果:看起来通过核心网桥发送的消息是事务性的。。。那么,是否可以批处理这些事务并使两个HornetQ实例之间的通信异步进行?

确定。。这是我自己想出来的

当转发HornetQ创建网桥时,它在内部只使用一个线程通过网桥发送消息,并且只打开一个到目标HornetQ的连接。因此,它无法利用多个处理器,也受到网络(延迟/带宽/rtt)的限制,无法有效地并行发送消息。因此,如果您的吞吐量很高,那么就开始达到上限(在我们的例子中,大约每秒200条消息)。您可以通过调整HornetQ连接器和接受器参数(如TCP发送和接收缓冲区大小)和网桥设置(确认窗口大小)来增加这一点,但这只会花费您很长时间(我们获得的吞吐量高达每秒300条左右)

解决方案-在同一对转发和目标HornetQ实例(涉及相同队列)之间创建多个网桥。这有效地并行了消息的传输,从而提高了吞吐量。创建三个网桥几乎使吞吐量增加了三倍,达到每秒870条消息


JBoss需要在核心网桥中理想地配置这种并行化。

我相信您使用的是2.2.5(从您的帖子中不清楚您使用的是什么版本),它在网桥上有一个bug,导致了您所说的问题

在某些版本中,网桥是同步发送消息,而不是依赖异步确认


看看它在最新版本上的表现。

在某个点上有一个bug。请看一下我的答案。