RabbitMq消息确认和重复消费问题

mq消息确认主要考虑两方面 生产投送方 消息是否投递成功,消费方消费是否消费成功


消息确认

1、生产者消息确认

生产者消息确认主要分为两种模式 同步模式与异步模式

同步模式 又分 单条消息确认与 批量确认

 单条消息确认: 使用普通发送模式,消息到达交换器就返回true;

 批量消息确认:使用批量确认模式,同步方式等待所有消息发送之后之后才会执行代码,只要有一个消息失败就抛异常

异步模式:

异步消息确认: 异步监听发送确认模式

因同步机制耗时,一般采取 异步消息确认

2、消费者消息确认

总共分为两种方式 手动确认 和 自动确认

消费者收到每一条消息都要进行确认,消息确认之后 mq才会从队列删除消息(消息也可以持久化保存),判断消息是否重新投递给消费者的唯一依据 是消费者连接是否断开。

自动确认

 设置 autoAck=true,消费者接到消息,就视为自动确认了。消费者处理消息过程中,如果发生异常,也不会再次投递。

手动确认

  当autoAck=false时,RabbitMQ会等待消费者显式发回ack信号后才从内存(和磁盘,如果是持久化消息的话)中移去消息。否则,RabbitMQ会在队列中消息被消费后立即删除它。

     采用消息确认机制后,只要令autoAck=false,消费者就有足够的时间处理消息(任务),不用担心处理消息过程中消费者进程挂掉后消息丢失的问题,因为RabbitMQ会一直持有消息直到消费者显式调用basicAck为止。

常用的Spring mq配置中 


//必须要设置 生产者消息确认

connectionFactory.setPublisherConfirms(true);

//消费者确认模式

// AcknowledgeMode.AUTO 为spring自带 ,成功消费就返回ack确认,消费异常返回 noack 消费队列注意捕获异常

// AcknowledgeModeNONE(不设置) AcknowledgeMode.MANUAL(手动)

factory.setAcknowledgeMode(AcknowledgeMode.AUTO);


mq重复消费情况

RabbitMQ 不保证消息不重复,如果你的业务需要保证严格的不重复消息,需要你自己在业务端去重。

AMQP 提供的是“至少一次交付”(at-least-once delivery),异常情况下,消息会被重复消费,此时业务要实现幂等性(重复消息处理)

参考:

RabbitMQ 消息确认机制 以及 原理解析

RabbitMQ 消息顺序、消息幂等、消息重复、消息事务

你可能感兴趣的:(RabbitMq消息确认和重复消费问题)