rabbitMQ服务内存占用大问题

问题:

业务发现rabbitMQ的服务器出现内存出现无限增加,由SRE和业务同事提出:想增加下qos配置,prefetchCount来限制消费端无限制的接受消息 导致消费服务应用内存一直增加

JVM现象:

频繁gc,dump堆数据看发现4G的内存,有3G都是这样的对象

 

rabbitMQ数据指标:

unacked表示已经下发到消费端没有ack

 

分析:

之前提到过preftech这个参数指标,但是基础组件的SDK封装时没有预留这个参数接口

preftech参数作用和功能:官方文档 https://www.rabbitmq.com/consumer-prefetch.htmlrabbitMQ服务内存占用大问题_第1张图片

 

也就是说通过消费channel的qos配置,来告诉rabbit这个channel消费者的缓冲区数目,从而达到防止缓冲区无限增大

解决:

修改组件增加preftech配置参数接口,后续验证有效

 

争议:

对于上面参数配置大小的合理性问题提出优化疑问:int prefetchCount = 0; // 消费者消息预读取数量,默认不限制,默认限制更好一点点

同时给出了几个参考资料:

https://www.mariuszwojcik.com/how-to-choose-prefetch-count-value-for-rabbitmq/rabbitMQ服务内存占用大问题_第2张图片

 

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

你可能感兴趣的:(kafka)