RabbitMQ消息丢失问题

本文为《RabbitMQ实战指南》读书笔记,如果想要了解更多内容,请购买正版书籍

  1. 从消费者角度
    如果订阅消费队列时将autoAck参数设置为true,那么消费者接到相关消息之后,还没来得及处理就宕机了,导致数据丢失。
    解决方法为:
    将autoAck设置为手动确认。

  2. 从生产者角度
    如果在不进行特殊配置,默认情况下发送消息的操作时不会返回任何信息给生产者的,也就是默认情况下生产者时不知道消息有没有正确地到达服务器。如果消息到达服务器之前已经丢失,也会造成消息丢失
    解决方法为:
    在发送端引入事务机制或者发送方确认机制来保证消息已经正确地发送并存储至RabbitMQ中,前提还要保证在调用channel.basicPublish方法的时候交换器能够将消息正确路由到相应的队列之中

  3. 从持久化角度
    在持久化的消息争取存入RabbitMQ之后,还需要一段时间(虽然很短,但是不可忽视)才能存入磁盘中。可能仅仅保存到操作系统缓存之中而不是物理磁盘之中。如果在这段时间内RabbitMQ服务节点发生了宕机,重启等异常情况,消息保存还没来得及落盘,那么这些消息将会丢失。
    解决方法为:
    使用RabbitMQ的镜像队列机制,相当于配置了副本,如果主节点(master)在此特殊时间内挂掉,可以自动切换到从节点(slave),这样有效地保证了高可用性,除非整个集群都挂掉。

你可能感兴趣的:(RabbitMQ学习)