ActiveMQ多個消費者消費不均勻問題
如果客戶端處理很慢的話,Broker會在之前傳送訊息的反饋之前,繼續傳送新的訊息到客戶端。如果客戶端依舊很慢的話,沒有得到確認反饋的訊息會持續增長。在這種情況下,Broker有可能會停止傳送訊息給消費者。當未被反饋的訊息達到了prefetch limit設定的數字時,Broker將會停止給消費者傳送新的訊息。除非消費者開始給與反饋,否則得不到任何訊息。
Default Prefetch Limit(預設預取限制):不同的消費者型別有不同的預設設定,具體設定如下:
如果想學習Java工程化、高效能及分散式、深入淺出。微服務、Spring,MyBatis,Netty原始碼分析的朋友可以加我的Java高階交流:787707172,群裡有阿里大牛直播講解技術,以及Java大型網際網路技術的視訊免費分享給大家。
Queue consumer:預設1000
如果你使用一組消費者進行分散工作量的話(一個Queue對應多個消費者),典型的你應該把數字設定的小一些。如果一個消費者被允許可以聚集大量的未被確認的訊息的話,會導致其它的消費者無事可做。同時,如果這個消費者出錯的話,會導致大量的訊息不能被處理,直到消費者恢復之前。
Queue browser:預設500
Topic consumer:預設32766
預設值32766是數字short的最大值,也是預取限制的最大值。
Durable topic subscriber:預設100
通常你可以通過增加預取限制來改善效能。
Optimizing prefetch limits(優化預取限制):通常的,優化Queue消費和持久化主題訂閱者(durable topic subscriber)是個好主意。
Queue consumers—如果你的queue只有一個消費者的話,你可以設定預取限制為一個相當大的值。但,如果一個queue有一組消費者的話,你最好限制到一個比較小的數字上,比如0或者1.
Durable topic subscribers—通常增大預取限制的數量會提高效能。嘗試一下增加到1000.
How to set prefectch limits(如何設定預取限制):你可以在Broker端或者消費者端設定預取制限。這有三種粒度的設定方式。如下:
java寫法
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(); Properties props = new Properties(); props.setProperty("prefetchPolicy.queuePrefetch", "1000"); props.setProperty("prefetchPolicy.queueBrowserPrefetch", "500"); props.setProperty("prefetchPolicy.durableTopicPrefetch", "100"); props.setProperty("prefetchPolicy.topicPrefetch", "32766"); factory.setProperties(props);
Per destination:一個最好的粒度,你可以在建立消費者的時候設定每個目的的預取限制。消費queue,TEST.QUEUE,時指定預取限制為10.建立MessageConsumer 例項的程式碼如下:
Queue queue = new ActiveMQQueue("TEST.QUEUE?consumer.prefetchSize=10"); MessageConsumer consumer = session.createConsumer(queue);
歡迎工作一到八年的Java工程師朋友們加入Java高階交流:787707172
本群提供免費的學習指導 架構資料 以及免費的解答
不懂得問題都可以在本群提出來 之後還會有直播平臺和