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

目录

消息堆积

消息丢失


 

消息堆积

 

消息堆积的本质

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

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

消息堆积的后果

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

 

消息堆积的原因

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

 

如何解决消息堆积

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

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

3.部署增加多个消费者

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

 

 

消息丢失

 

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

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

 

1.消息在生产者丢失

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

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

 

2. 消息在MQ中丢失

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

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

 

3.消息在消费者丢失

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

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