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

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

 

若是客戶端處理很慢的話,Broker會在以前發送消息的反饋以前,繼續發送新的消息到客戶端。若是客戶端依舊很慢的話,沒有獲得確認反饋的消息會持續增加。在這種狀況下,Broker有可能會中止發送消息給消費者。當未被反饋的消息達到了prefetch limit設置的數字時,Broker將會中止給消費者發送新的消息。除非消費者開始給與反饋,不然得不到任何消息。java

Default Prefetch Limit(默認預取限制):不一樣的消費者類型有不一樣的默認設置,具體設置以下:session

若是想學習Java工程化、高性能及分佈式、深刻淺出。微服務、Spring,MyBatis,Netty源碼分析的朋友能夠加個人Java高級交流:787707172,羣裏有阿里大牛直播講解技術,以及Java大型互聯網技術的視頻免費分享給你們。架構

Queue consumer:默認1000分佈式

若是你使用一組消費者進行分散工做量的話(一個Queue對應多個消費者),典型的你應該把數字設置的小一些。若是一個消費者被容許能夠彙集大量的未被確認的消息的話,會致使其它的消費者無事可作。同時,若是這個消費者出錯的話,會致使大量的消息不能被處理,直到消費者恢復以前。微服務

Queue browser:默認500源碼分析

Topic consumer:默認32766性能

默認值32766是數字short的最大值,也是預取限制的最大值。學習

Durable topic subscriber:默認100fetch

一般你能夠經過增長預取限制來改善性能。優化

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

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

不懂得問題均可以在本羣提出來 以後還會有直播平臺和講師直接交流噢

相關文章
相關標籤/搜索