Redis怎么保证接口幂等性和消息不被重复消费

  • 结合网上下单实例说明如何保证接口幂等性
  • 为什么需要将生成的version字段返回给客户端
  • 为什么要去做分布式锁
  • 如何保证消息不被重复消费
  • 为什么需要去做分布式锁处理


结合网上下单实例说明如何保证接口幂等性

结合具体的实例来看一下,我们平常用的比较多的就是网上下单。

我们在下单的过程中需要把商品添加到购物车,添加购物车之后然后后再提交订单。我们在提交订单这个动作,需要去保证接口幂等的。

这个的接口幂等是如何保证的呢,具体可以看下面图:

redis stream如何保证重复消费 redis防止重复消费_redis


第一步,客户端首先需要添加商品到购物车,我们可以把它称作一个预览请求。预览请求的话就会返回一些购物车的一些试算的一些结果。比如说它的一些总价。

这时候客户端添加商品到购物车,购物车在服务端进行一些逻辑试算。这时候,我们需要去生成一个version保存在Redis中。同时我们需要将这个version字段返回给客户端

为什么需要将生成的version字段返回给客户端

因为客户端在第二步去提交订单的时候,需要将这个version值带给服务端看。这客服端去提交订单携带version到服务端。服务端要基于这个version字段去做一个分布式锁处理

为什么要去做分布式锁

因为如果说客户端携带version请求的有很多个,都到了服务端。如果没加分布式锁的话,会有并发问题

到了服务端,我们首先去判断version字段是否存在,如果version字段存在,才会继续走后面的逻辑处理。处理完之后再把version字段删除掉。如果服务端去判断version字段不存在,那这个请求就直接返回。这样就可以保证接口的一个幂等性。

如何保证消息不被重复消费

首先生产者会将消息发给消费者,消费者需要去基于生产者里面的消息的唯一属性,去做一些分布式锁的处理。

redis stream如何保证重复消费 redis防止重复消费_服务端_02

为什么需要去做分布式锁处理

其实跟上面的类似,就是说避免同时有生产者相同的消息多条到消费者。这时候我们需要去判断version是否存在。这个version可以是自定义的。如果说version字段不存在,我们就可以去生成一个唯一的version,保存在redis中。

如果现在生产者又来了一条相同的消息到了消费者,现在我们去判断version字段是否存在。如果已经存在的话,那么就可以就不处理这个消息,这样就可以保证消息不被重复消费。

参考资料redis怎么做幂等?