rabbitMQ服務內存佔用大問題

問題:

業務發現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參數大小由使用者根據自身服務情況優化