一、rabbitmq出现消息重复的场景
1、消费成功,没有进行ack,这时 Broker 会重新发送
2、不确认(unack)或 reject 之后,重新排队,Broker 会重新发送
3、消费成功,ack时宕机,没有ack成功,消息由unack变为ready,Broker又重新发送
4、总的来说就是 Broker 发送消息后,消费端收到消息了,但是ack时候出现网络或其他问题,Broker 没有收到确认,就会重发
说明:
由于重复消息是由于网络原因或其他不确定性造成的,因此不可避免重复消息。但是我们要确保消息的幂等性
二、解决方案(保证消息的幂等性)
1、把消息唯一 Id 写入redis的push字典,或者写入DB,用来校验此条消息是否被消费过
2、在消息对应的数据表,每当消息到达消费端时,通过对消息的状态与表数据状态进行判断,防止消息重复消费
3、利用消息体中的关键参数,例如:id、业务编号、订单编号等,根据这些关键参数进行查询数据表,有数据就不再增加(或者校验该数据是某种特定状态不再增加)文章来源:https://www.toymoban.com/news/detail-635323.html
三、注意
1、消息队列是异步的,所以在消费端处理业务时,如果需要校验消息发送端处理或计算的结果,需要注意消息发送端的事务是否已经提交。这种场景一般发送延迟消息,等待发送端事务提交文章来源地址https://www.toymoban.com/news/detail-635323.html
到了这里,关于RabbitMQ防止消息重复消费、保证异步消息的幂等性的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!