MQ百万消息持续积压问题

消息积压

消息积压的原因是生产者的消息生产速度大于消费者的消费速度,遇到这个问题的时候,需要排查具体的原因再提出解决方案
  • 流量变大,而RabbitMQ服务器配置偏低,导致消息产生速度大于消费速度;
    扩容即可。可以纵向扩容,即增加服务器资源,该加内存加内存,该加 CPU CPU 。如果纵向
    扩容不方便,那就横向扩容,即将单机改为集群模式,增加集群节点,并且增加消费者数量,
    让消费速度快起来!原来是 5 个消费者,现在变成 50 个消费者!
    通过异步的方式来处理消息、或者通过批量处理的方式来消费。
    采用惰性队列扩大交换器和消费者之间的消息可积压空间,正常队列把消息存放在内存中,可
    利用空间较小,惰性队列接收到消息后直接存入磁盘而非内存,要消费消息时才会从磁盘中读
    取并加载到内存,支持数百万数据的存储
  • 消费者故障,从而消息只增不减;
    通过查看日志搞清楚为什么消费者会故障,据我多年经验,发生此类问题大概率是程序代码写
    的不够完美,跑着跑着导致 内存溢出 ,然后消费者进程被杀。要想 永久解决此问题 ,需要结合
    日志分析程序代码,优化代码。 临时解决方法 是写监控脚本,如果发现消费者进程中断,需要
    重启服务!
  • 程序逻辑设计有问题,导致生产者持续生产消息,而消费者不消费或者消费慢;
    种情况发生的概率其实并不高,总之就是程序逻辑问题,判断的方法也很简单,持续观察服务
    器的资源耗费情况,如果内存、 CPU 一切都正常,但就是队列持续增长,而消费速度非常慢。
    此时,就需要好好查查程序代码了。当然,可以尝试增加消费者数量,看看是否有好转。 

业务考虑 

相信,当我们发现消息积压时,想必问题已经比较严重了,或者说已经影响到业务正常运转了,那么当务之急肯定是需要先将业务恢复正常。对于上面第二种情况,直接重启相关服务,让消费者恢复正常,定是首当其冲。
除此之外,还有一种 断尾求生 的骚操作,就是新开一个队列,将新产生的消息到新队列里,消费者也到新队列里消费。而老的队列,则需要做一个异步处理,慢慢消费掉即可。
当然,如果积压的消息不怎么重要,可有可无的话,那干脆直接删除掉,这样大家都省事不是。

解决方案

第一:提高消费者的消费能力 ,可以使用多线程消费任务

第二:增加更多消费者,提高消费速度

使用工作队列模式, 设置多个消费者消费消费同一个队列中的消息

第三:扩大队列容积,提高堆积上限

可以使用RabbitMQ惰性队列,惰性队列的好处主要是

①接收到消息后直接存入磁盘而非内存

②消费者要消费消息时才会从磁盘中读取并加载到内存

③支持数百万条的消息存储

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值