天天看點

ActiveMQ(25):優化與建議

一、什麼時候使用ActiveMQ

1、異步調用

2、一對多通信

3、做多個系統的內建,同構、異構

4、作為RPC的替代

5、多個應用互相解耦

6、作為事件驅動架構的幕後支撐

7、為了提高系統的可伸縮性

二、優化

ActiveMQ的性能依賴于很多因素,比如:

 1:網絡拓撲結構,比如:嵌入、主從複制、網絡連接配接

 2:transport協定

 3:service的品質,比如topic還是queue,是否持久化,是否需要重新投遞,消息逾時等

 4:硬體、網絡、JVM和作業系統等

 5:生産者的數量,消費者的數量

 6:消息分發要經過的destination數量,以及消息的大小等

2.1、調整Prefetch Limit

ActiveMQ預設的prefetch大小不同的:

 1:Queue Consumer 預設1000

 2:Queue Browser Consumer預設500

 3:Persistent Topic Consumer預設1000

 4:Non-persistent Topic Consumer預設32767

Prefecth policy設定示例如下:

<code>ActiveMQConnectionFactory cf = </code><code>new</code> <code>ActiveMQConnectionFactory();</code>

<code>Properties props = </code><code>new</code> <code>Properties();</code>

<code>props.setProperty(</code><code>"prefetchPolicy.queuePrefetch"</code><code>, </code><code>"1000"</code><code>);</code>

<code>props.setProperty(</code><code>"prefetchPolicy.queueBrowserPrefetch"</code><code>, </code><code>"500"</code><code>);</code>

<code>props.setProperty(</code><code>"prefetchPolicy.durableTopicPrefetch"</code><code>, </code><code>"1000"</code><code>);</code>

<code>props.setProperty(</code><code>"prefetchPolicy.topicPrefetch"</code><code>, </code><code>"32767"</code><code>);</code>

<code>cf.setProperties(props);</code>

也可以在建立Destination的時候設定prefetch size,示例如下:

<code>Queue queue = </code><code>new</code> <code>ActiveMQQueue(</code><code>"TEST.QUEUE?consumer.prefetchSize=10"</code><code>);</code>

<code>MessageConsumer consumer = session.createConsumer(queue);</code>

2.2、控制生産者流量

可以通過xml配置,代碼開啟方式如下:

<code>cf.setProducerWindowSize(</code><code>1024000</code><code>);</code>

2.3、關閉消息的複制功能

能部分提高心能,在連接配接工廠上設定,如下:

<code>ActiveMQConnectionFaction cf = …..</code>

<code>cf.setCopyMessageOnSend(</code><code>false</code><code>);</code>

2.4、調整TCP協定

TCP協定是ActiveMQ中最常使用的協定,常見有如下配置會影響協定性能:

 1:socketBufferSize:socket的緩存大小,預設是65536

 2:tcpNoDelay:預設是false

示例如:

<code>String url = "failover://(tcp://localhost:61616?tcpNoDelay=true)";</code>

<code>ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory(url);</code>

2.5、消息自動确認

官方建議使用自動确認的模式,同時還可以開啟優化确認的選項,如下:

<code>cf.setOptimizeAcknowledge(</code><code>true</code><code>);</code>

在消費者這邊,session會在一個單獨的線程中分發消息給消費者,如果你使用的自動确認模式,為了增加吞吐量,你可以直接通過session傳遞消息給消費者,示例如下:

<code>cf.setAlwaysSessionAsync(</code><code>false</code><code>);</code>

2.6、KahaDB消息存儲優化

如果使用KahaDB進行消息存儲的話,可以調整如下選項來優化性能:

1:indexCacheSize:預設為10000,用來設定緩存頁的個數,預設情況一頁是4KB,一般來說緩存的大小盡可能的設定大一些,以避免記憶體不足時頻繁的交換。

2:indexWriteBatchSize:預設1000,用來設定髒索引(髒索引就是cache中的index和消息存儲中的index狀态不一樣)達到多少之後,就需要把索引存儲起來。如果你想最大化broker的速度,那麼就把這個值設定的盡可能的大一些,這樣的話,僅會在到達checkpoint的時候,索引才會被存儲起來。但是這樣會增大系統出錯的時候,丢失大量的中繼資料的風險。

3:journalMaxFileLength:預設32mb,當broker的吞吐量特别大的時候,日志檔案會很快被寫滿,這樣會因為頻繁的關閉檔案,打開檔案而導緻性能低下。你可以通過調整檔案的size,減少檔案切換的頻率,進而獲得輕微的性能改善。

4:enableJournalDiskSyncs:預設為true,通常,broker會在給producer确認之前,把消息同步到磁盤上(并且確定消息物化到磁盤上)。你可以通過設定這個選項為false,進而獲得本質的性能改善。但是這樣的話,多少會降低broker的可靠性。

三、建議

1、盡量使用基于檔案的消息存儲方案,比如使用KahaDB的方式

2、可以考慮内嵌啟動broker,這樣應用和Broker之間可以使用VM協定通訊,速度快

3、盡量使用異步投遞消息,示例如:cf.setUseAsyncSend(true);

4、非持久化消息比持久化消息更快

  原因如下:

   a:非持久化發送消息是異步的,Producer不需要等待Consumer的receipt消息

   b:而持久化是要把消息先存儲起來,然後再傳遞

5、Transaction比Non-transaction更快

本文轉自我愛大金子部落格51CTO部落格,原文連結http://blog.51cto.com/1754966750/1928873如需轉載請自行聯系原作者

我愛大金子