消息堆积

定义

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

后果

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

解决方法

  • 排查消费者的消费性能瓶颈
  • 增加消费者的多线程处理
  • 部署增加多个消费者
  • 新增消息队列,可以想办法把消息按顺序的转移到一个新的队列,让消费者消费新队列中的消息

消息丢失

生产者丢失消息

原因

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

解决方法

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

MQ丢失消息

原因

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

解决方法

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

消费者丢失消息

原因

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

解决方法

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

参考

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