若是客戶端處理很慢的話,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
本羣提供免費的學習指導 架構資料 以及免費的解答
不懂得問題均可以在本羣提出來 以後還會有直播平臺和講師直接交流噢