業務發現rabbitMQ的服務器出現內存出現無限增加,由SRE和業務同事提出:想增加下qos配置,prefetchCount來限制消費端無限制的接受消息 導致消費服務應用內存一直增加
JVM現象:
頻繁gc,dump堆數據看發現4G的內存,有3G都是這樣的對象
rabbitMQ數據指標:
unacked表示已經下發到消費端沒有ack
之前提到過preftech這個參數指標,但是基礎組件的SDK封裝時沒有預留這個參數接口
preftech參數作用和功能:官方文檔 https://www.rabbitmq.com/consumer-prefetch.html
也就是說通過消費channel的qos配置,來告訴rabbit這個channel消費者的緩衝區數目,從而達到防止緩衝區無限增大
修改組件增加preftech配置參數接口,後續驗證有效
對於上面參數配置大小的合理性問題提出優化疑問:int prefetchCount = 0; // 消費者消息預讀取數量,默認不限制,默認限制更好一點點
同時給出了幾個參考資料:
https://www.mariuszwojcik.com/how-to-choose-prefetch-count-value-for-rabbitmq/
https://www.rabbitmq.com/amqp-0-9-1-reference.html#basic.qos.prefetch-size
最後決定:1. size 不支持 2. consumer 數量不知道 3. 快、慢不知道 所以結論很簡單,默認0
https://www.cnblogs.com/iiwen/p/10194889.html
最後這個最佳參數大小,由使用方自己進行控制。
例如通過apollo配置,一邊觀察一邊調整
1.SDK版本升級基礎組件預留出preftech配置接口
2.preftech參數大小由使用者根據自身服務情況優化