RabbitMQ

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

2020-11-27  本文已影响0人  倚仗听江

一. 消息堆积

消息堆积一般来说就是消息发送的速率大于消息消费的速率造成的。
解决方案:

  1. 增加消费者以及后端其他服务组件的吞吐能力。
  2. 增加消费者的多线程处理
  3. 根据不同的业务实现不同的丢弃任务,选择不同的策略淘汰任务,例如FIFO/LRU等。
  4. 默认情况下,rabbitmq消费者为单线程串行消费,设置并发消费两个关键属性concurrentConsumers和prefetchCountoncurrentConsumers设置的是对每个listener在初始化的时候设置的并发消费者的个数,prefetchCount是每次一次性从broker里面取的待消费的消息的个数。

二. 消息丢失

  1. 在生产者中丢失
    原因:生产者发送消息成功,但MQ没收到该消息,消息在从生产者传输到MQ的过程中丢失,一般由网络不稳定造成。
    解决方案:发送方采用消息确认机制,当消息成功被MQ接收到后,会给生产者发送一个确认消息,表示接收成功。
  2. 在MQ中丢失
    原因:消息发送到MQ后,消息还没被消费却在MQ中丢失了。比如MQ服务器宕机或者未进行持久化进行了重启。
    解决方案:持久化交换机、队列、消息。确保MQ服务器重启时仍然能从磁盘恢复对应的交换机,队列和消息。然后我们把MQ做多台分布式集群,防止出现所有的MQ服务器挂掉。注意:交换机、队列、消息都要持久化。


    交换机持久化.png
    队列持久化.png
    消息持久化.png
  3. 在消费者中丢失
    原因:默认消费者消费消息时,设置的是自动回复MQ,收到了消息。MQ会立刻删除自身保存的这条消息,如果消息已经在MQ中被删除,但消费者的业务处理出现异常或消费者服务宕机,那么就会导致该消息没有处理成功从而导致消息丢失。
    解决方案:设置手动ACK。
上一篇 下一篇

猜你喜欢

热点阅读