如何让消息队列在消费时实现真正的幂等性呢?
- 内容介绍
- 文章标签
- 相关推荐
哎,说起消息队列的幂等性啊,那真是个让人头疼的问题!当初我刚接手项目的时候,就主要原因是没考虑到这块儿,导致线上数据混乱了好一阵子。 小丑竟是我自己。 用户反馈订单重复创建,财务那边天天找我核对账单… 那滋味儿,简直生不如死!所以今天就来好好唠唠这个话题,争取把这块儿讲透彻了。
什么是消息队列的幂等性?
简单就是你一条消息,无论被消费者处理多少次后来啊都应该是一样的。就好像你给银行转账100块钱,不管这个转账请求发几次你的账户到头来扣掉的钱都应该是100块。不能主要原因是网络抖动或者消费者BUG导致钱被扣了两次、三次… 那可就闹大了!

基本上... 消息队列中如何保证幂等性.可以看出,消息发送和消息消费两个步骤是有可能产生消息不幂等的问题。.步骤4:消息队列服务 MQ-Server 将消息发给给消费端 MQ-Client Consumer.
为什么需要考虑幂等性?
想想看, 如果你的系统没有做好幂等性处理,那么在以下几种情况下就很容易出问题:
- 网络重试: 客户端发送请求后由于网络问题收不到响应,客户端可能会重试。
- MQ自身重试: 消息队列为了保证可靠性,可能会对失败的消息进行重试。
- 消费者BUG: 消费者在处理消息的过程中出现异常导致处理失败。
这些情况都会导致同一条消息被多次处理,从而造成数据的不一致。
最朴素的方法:先判断后更新
一开始我也想过最简单的办法——先判断状态再更新。比如对于一个订单创建的请求,先查询一下这个用户有没有已经创建过订单了。如果没有的话就创建订单;如果有的话就直接返回成功。但是!这种方法在高并发场景下很容易出问题,太治愈了。。
哎,说起消息队列的幂等性啊,那真是个让人头疼的问题!当初我刚接手项目的时候,就主要原因是没考虑到这块儿,导致线上数据混乱了好一阵子。 小丑竟是我自己。 用户反馈订单重复创建,财务那边天天找我核对账单… 那滋味儿,简直生不如死!所以今天就来好好唠唠这个话题,争取把这块儿讲透彻了。
什么是消息队列的幂等性?
简单就是你一条消息,无论被消费者处理多少次后来啊都应该是一样的。就好像你给银行转账100块钱,不管这个转账请求发几次你的账户到头来扣掉的钱都应该是100块。不能主要原因是网络抖动或者消费者BUG导致钱被扣了两次、三次… 那可就闹大了!

基本上... 消息队列中如何保证幂等性.可以看出,消息发送和消息消费两个步骤是有可能产生消息不幂等的问题。.步骤4:消息队列服务 MQ-Server 将消息发给给消费端 MQ-Client Consumer.
为什么需要考虑幂等性?
想想看, 如果你的系统没有做好幂等性处理,那么在以下几种情况下就很容易出问题:
- 网络重试: 客户端发送请求后由于网络问题收不到响应,客户端可能会重试。
- MQ自身重试: 消息队列为了保证可靠性,可能会对失败的消息进行重试。
- 消费者BUG: 消费者在处理消息的过程中出现异常导致处理失败。
这些情况都会导致同一条消息被多次处理,从而造成数据的不一致。
最朴素的方法:先判断后更新
一开始我也想过最简单的办法——先判断状态再更新。比如对于一个订单创建的请求,先查询一下这个用户有没有已经创建过订单了。如果没有的话就创建订单;如果有的话就直接返回成功。但是!这种方法在高并发场景下很容易出问题,太治愈了。。

