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参数大小由使用者根据自身服务情况优化