2012-03-13 73 views
6

我们正在尝试使用HornetQ存储和转发机制......但是将消息从一个独立的HornetQ实例转发到另一个使用核心网桥的消息非常缓慢。我们无法将吞吐量提高到每秒200条消息以上。使用HornetQ核心网桥的吞吐量非常低

令人惊讶的事实是,如果我们直接在目的地HornetQ实例指向同一客户端(即将消息发布到转发HornetQ实例),我们开始观察每秒超过1000条消息的吞吐率(该客户端是JMS基于)。这基本上意味着在Forwarding HornetQ实例和Destination 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 /网络等)未充分利用,日志中没有错误。

注意:我们已经尝试了NIO以及遗留/旧IO。这已经在HornetQ-2.2.5-Final和HornetQ-2.2.8-GA(2.2.8-GA从源头构建)两方面尝试过。

任何有关可能导致此问题的原因以及解决方案可能?

其他意见:它看起来像通过核心桥发送的消息是事务性的...所以可以批量处理这些事务,并让两个HornetQ实例之间的通信异步发生?

+0

这是一个修正的问题 – 2012-05-10 21:17:13

回答

3

好的。我想出了我自己。

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

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

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

+0

在某个时候有一个错误。请看看我的答案。 – 2012-05-07 19:19:04

1

我相信你正在使用2.2.5(从你的文章中不清楚你使用的是什么版本),这些错误导致了你所说的问题。

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

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