美文网首页RabbitMQ
如何解决RabbitMQ的消息堆积和消息丢失

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

作者: 倚仗听江 | 来源:发表于2020-11-27 13:47 被阅读0次

    一. 消息堆积

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

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

    二. 消息丢失

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


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

    相关文章

      网友评论

        本文标题:如何解决RabbitMQ的消息堆积和消息丢失

        本文链接:https://www.haomeiwen.com/subject/cmfxwktx.html