2012-03-13 41 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(從你的文章中不清楚你使用的是什麼版本),這些錯誤導致了你所說的問題。

在某些版本中,網橋正在同步發送消息,而不是依賴異步確認。

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