RabbitMQ防止消息重复消费、保证异步消息的幂等性

本文探讨了RabbitMQ中可能出现消息重复的场景,并提出了解决方案以确保消息的幂等性。通过将消息ID存入缓存或数据库、消息状态校验以及利用消息关键参数来避免重复消费。同时强调了在异步消息处理中注意发送端事务的提交以及延迟消息时幂等性的重要性。
摘要由CSDN通过智能技术生成

一、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、业务编号、订单编号等,根据这些关键参数进行查询数据表,有数据就不再增加(或者校验该数据是某种特定状态不再增加)

三、注意
1、消息队列是异步的,所以在消费端处理业务时,如果需要校验消息发送端处理或计算的结果,需要注意消息发送端的事务是否已经提交。这种场景一般发送延迟消息,等待发送端事务提交

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值