ActiveMQ 使用和優化

什麼時候使用ActiveMQ
1 異步調用
2 一對多通信
3 做多個系統的集成,同構、異構
4 作爲RPC的替代
5 多個應用相互解耦
6 作爲事件驅動架構的幕後支撐

7 爲了提高系統的可伸縮性

ActiveMQ優化
ActiveMQ的性能依賴於很多因素,比如:
1:網絡拓撲結構,比如:嵌入、主從複製、網絡連接
2:transport協議
3:service的質量,比如topic還是queue,是否持久化,是否需要重新投遞,消息超時等
4:硬件、網絡、JVM和操作系統等
5:生產者的數量,消費者的數量
6:消息分發要經過的destination數量,以及消息的大小等
a.非持久化消息比持久化消息更快,原因如下:
    1:非持久化發送消息是異步的,Producer不需要等待Consumer的receipt消息
    2:而持久化是要把消息先存儲起來,然後再傳遞
b.儘量使用異步投遞消息,示例如:
    cf.setUseAsyncSend(true);
    Transaction比Non-transaction更快
c.可以考慮內嵌啓動broker,這樣應用和Broker之間可以使用VM協議通訊,速度快

d.儘量使用基於文件的消息存儲方案,比如使用KahaDB的方式

e.調整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設置示例如下:
ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory();
Properties props = new Properties();
props.setProperty("prefetchPolicy.queuePrefetch", "1000");
props.setProperty("prefetchPolicy.queueBrowserPrefetch", "500");
props.setProperty("prefetchPolicy.durableTopicPrefetch", "1000");
props.setProperty("prefetchPolicy.topicPrefetch", "32767");
cf.setProperties(props);
也可以在創建Destination的時候設置prefetch size,示例如下:
Queue queue = new ActiveMQQueue("TEST.QUEUE?consumer.prefetchSize=10");

MessageConsumer consumer = session.createConsumer(queue);

f.可以考慮生產者流量控制(如果沒有流量控制生產者快速生成大量消息,可能會造成消費者消息積壓導致broker性能下降),可以通過xml配置,代碼開啓方式如下:
    cf.setProducerWindowSize(1024000);
g.可以考慮關閉消息的複製功能,也能部分提高心能,在連接工廠上設置,如下:
    ActiveMQConnectionFaction cf = …..
    cf.setCopyMessageOnSend(false);
h.調整TCP協議
TCP協議是ActiveMQ中最常使用的協議,常見有如下配置會影響協議性能:
    1:socketBufferSize:socket的緩存大小,默認是65536
    2:tcpNoDelay:默認是false
    示例如:
    String url = "failover://(tcp://localhost:61616?tcpNoDelay=true)";
    ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory(url);
i.消息投遞和消息確認
官方建議使用自動確認的模式,同時還可以開啓優化確認的選項,如下:
ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory();

cf.setOptimizeAcknowledge(true);

j.在消費者這邊,session會在一個單獨的線程中分發消息給消費者,如果你使用的自動確認模式,爲了增加吞吐量,你可以直接通過session傳遞消息給消費者,示例如下:
ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory();
cf.setAlwaysSessionAsync(false);
k.如果使用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的可靠性。

發佈了56 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章