1. 程式人生 > >ActiveMQ多個消費者消費不均勻問題

ActiveMQ多個消費者消費不均勻問題

開發十年,就只剩下這套架構體系了! >>>   

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

本群提供免費的學習指導 架構資料 以及免費的解答

不懂得問題都可以在本群提出來 之後還會有直播平臺和