Redis怎么保证接口幂等性和消息不被重复消费
- 结合网上下单实例说明如何保证接口幂等性
- 为什么需要将生成的version字段返回给客户端
- 为什么要去做分布式锁
- 如何保证消息不被重复消费
- 为什么需要去做分布式锁处理
结合网上下单实例说明如何保证接口幂等性
结合具体的实例来看一下,我们平常用的比较多的就是网上下单。
我们在下单的过程中需要把商品添加到购物车,添加购物车之后然后后再提交订单。我们在提交订单这个动作,需要去保证接口幂等的。
这个的接口幂等是如何保证的呢,具体可以看下面图:
第一步,客户端首先需要添加商品到购物车,我们可以把它称作一个预览请求。预览请求的话就会返回一些购物车的一些试算的一些结果。比如说它的一些总价。
这时候客户端添加商品到购物车,购物车在服务端进行一些逻辑试算。这时候,我们需要去生成一个version,保存在Redis中。同时我们需要将这个version字段返回给客户端。
为什么需要将生成的version字段返回给客户端
因为客户端在第二步去提交订单的时候,需要将这个version值带给服务端看。这客服端去提交订单携带version到服务端。服务端要基于这个version字段去做一个分布式锁处理。
为什么要去做分布式锁
因为如果说客户端携带version请求的有很多个,都到了服务端。如果没加分布式锁的话,会有并发问题。
到了服务端,我们首先去判断version字段是否存在,如果version字段存在,才会继续走后面的逻辑处理。处理完之后再把version字段删除掉。如果服务端去判断version字段不存在,那这个请求就直接返回。这样就可以保证接口的一个幂等性。
如何保证消息不被重复消费
首先生产者会将消息发给消费者,消费者需要去基于生产者里面的消息的唯一属性,去做一些分布式锁的处理。
为什么需要去做分布式锁处理
其实跟上面的类似,就是说避免同时有生产者相同的消息多条到消费者。这时候我们需要去判断version是否存在。这个version可以是自定义的。如果说version字段不存在,我们就可以去生成一个唯一的version,保存在redis中。
如果现在生产者又来了一条相同的消息到了消费者,现在我们去判断version字段是否存在。如果已经存在的话,那么就可以就不处理这个消息,这样就可以保证消息不被重复消费。
参考资料:redis怎么做幂等?