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

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

如果客戶端處理很慢的話,Broker會在之前傳送訊息的反饋之前,繼續傳送新的訊息到客戶端。如果客戶端依舊很慢的話,沒有得到確認反饋的訊息會持續增長。在這種情況下,Broker有可能會停止傳送訊息給消費者。當未被反饋的訊息達到了prefetch limit設定的數字時,Broker將會停止給消費者傳送新的訊息。除非消費者開始給與反饋,否則得不到任何訊息。


Default Prefetch Limit(預設預取限制):不同的消費者型別有不同的預設設定,具體設定如下:

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這條路上掙扎,也想在IT行業拿高薪,可以參加我們的訓練營課程,選擇最適合自己的課程學習,技術大牛親授,7個月後,進入名企拿高薪。我們的課程內容有:Java工程化、高效能及分散式、高架構。效能調優、Spring,MyBatis,Netty原始碼分析和大資料等多個知識點。如果你想拿高薪的,想學習的,想就業前景好的,想跟別人競爭能取得優勢的,想進阿里面試但擔心面試不過的,你都可以來,q群號為:277763288

注:加群要求

1、具有1-5工作經驗的,面對目前流行的技術不知從何下手,需要突破技術瓶頸的可以加。

2、在公司待久了,過得很安逸,但跳槽時面試碰壁。需要在短時間內進修、跳槽拿高薪的可以加。

3、如果沒有工作經驗,但基礎非常紮實,對java工作機制,常用設計思想,常用java開發框架掌握熟練的,可以加。

4、覺得自己很牛B,一般需求都能搞定。但是所學的知識點沒有系統化,很難在技術領域繼續突破的可以加。

5.阿里Java高階大牛直播講解知識點,分享知識,多年工作經驗的梳理和總結,帶著大家全面、科學地建立自己的技術體系和技術認知!