一、什麼時候使用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如需轉載請自行聯系原作者
我愛大金子