如何解决RabbitMQ的消息堆积与消息丢失

本文讨论了RabbitMQ中消息堆积的原因和解决策略,包括排查消费者性能瓶颈、增加消费者数量、调整参数等。同时,针对消息丢失,提出了生产者、消息队列和消费者层面的解决方案,如使用消息确认机制、持久化和手动ACK设置。

目录

消息堆积

消息丢失


 

消息堆积

 

消息堆积的本质

当消息生产速度远远大于消息消费的速度,就会造成消息堆积。 

消息堆积的后果

新消息无法进入队列、旧消息无法丢失、消息等待消费时间过长以至于超出了业务容忍范围。

 

消息堆积的原因

生产者突然大量发布消息、消费者消费失败、消费者出现性能瓶颈、消费者直接挂掉了

 

如何解决消息堆积

1.排查消费者的消费性能瓶颈

2.增加消费者的多线程处理

3.部署增加多个消费者

4.新增消息队列,可以想办法把消息按顺序的转移到一个新的队列,让消费者消费新队列中的消息

5.通过修改RabbitMQ的两个参数来增大消费消息的并发数:

concurrentConsumers:对每个listener在初始化的时候设置的并发消费者的个数。

prefetchCount:每次一次性从broker里面取的待消费的消息的个数。prefetchCount是BlockingQueueConsumer内部维护的一个阻塞队列LinkedBlockingQueue的大小,其作用就是如果某个消费者队列阻塞,就无法接收新的消息,该消息会发送到其它未阻塞的消费者。如果我们想增大消费者的速度,可以通过配置者两个参数来进行

 

 

消息丢失

 

生产环境中可能出现一条消息因为某种原因丢失,我们怎么保证消息不会丢失呢?

需要同时对生产者、消息队列、消费者做出处理~

 

1.消息在生产者丢失

原因:生产者发送消息成功,但MQ没收到该消息,消息在从生产者传输到MQ的过程中丢失,一般由网络不稳定造成。

解决方案:发送方采用消息确认机制,当消息成功被MQ接收到后,会给生产者发送一个确认消息,表示接收成功。RabbitMQ发送方确认模式有三种,普通确认、批量确认、异步确认。Spring整合RabbitMQ后只使用了异步监听确认模式

 

2. 消息在MQ中丢失

原因:消息发送到MQ后,消息还没被消费却在MQ中丢失了。比如MQ服务器宕机或者未进行持久化进行了重启。

解决方案:持久化交换机、队列、消息。确保MQ服务器重启时仍然能从磁盘恢复对应的交换机,队列和消息。然后我们把MQ做多台分布式集群,防止出现所有的MQ服务器挂掉~

 

3.消息在消费者丢失

原因:默认消费者消费消息时,设置的是自动恢复MQ收到了消息。MQ会立刻删除自身保存的这条消息,如果消息已经在MQ中被删除,但消费者的业务处理出现异常或消费者服务宕机,那么就会导致该消息没有处理成功从而导致消息丢失。

解决方案:消费者向MQ的回复我们设置成手动回复。当消费者出现异常或者服务宕机时,MQ服务器不会删除该消息,而是会把消息重发给绑定该队列的消费者,如果该队列只绑定了一个消费者,则该消息会一直保持在MQ服务器,直到消费者能正常消费为止。具体做法是设置手动ACK

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值