记录RabbitMQ如何避免消息丢失的方法

1.消息持久化

①交换机的持久化(在消息接收方的方法上的@RabbitListener(bindings = @QueueBinding(...))注解中定义)
value = @Queue(value = "xx.xx.xx", durable = "true")
②队列的持久化(默认就是持久化的)
exchange = @Exchange(value = "xx.xx.xx",ignoreDeclarationExceptions = "true",type = "topic")
③消息的持久化(deliveryMode=2)

默认调用amqpTemplate的convertAndSend()方法默认配置消息就是持久化的

2.Confirm消息确认机制

①发布确认(在配置文件中配置)

原理:在消息生产端发送一条消息到MQ的时候,MQ接收到之后会返回一条确认信息给生产端

spring:
    rabbitmq:
        publisher-confirms: true
②接收确认(在配置文件中配置)

原理:在消息接收端从MQ接收到一条消息的时候,接收端会返回一条确认信息给MQ

spring:
    rabbitmq:
        publisher-returns: true

3.ACK确认机制

在MQ将消息传递给消费端时,默认情况下会在发送之后自动将该消息进行确认并删除,这样的话,如果消息在MQ发送给消费端的过程中发生了差错,就没有办法来获取出现问题的消息,那么此时我们可以手动设置ACK的确认机制

# 该模式有三种方式:1.自动确认 none 2.根据情况确认 auto 3.手动确认 manual
spring:
  rabbitmq:
    listener:
      simple:
        acknowledge-mode: manual

添加完配置之后,再接收到确认信息的时候手动进行确认

channel.basicAck(deliveryTag,false);

4.消息补偿机制

  • ①消息入库
    (1)在消息发出之前,将该信息保存到一个数据库中,为该信息添加一个status的字段,并设为0
    (2)当收到发布确认的确认信息时,将上述的字段设为1
    (3)同时对于长时间状态为0的消息进行额外处理(重发/写入日志)

5.集群镜像机制

你可能感兴趣的:(记录RabbitMQ如何避免消息丢失的方法)