4-2 消息幂等性
2020-07-16 本文已影响0人
Finlay_Li
幂等性是什么?
- 用户对于同一操作发起的一次或者多次请求,最后的结果都是相同的,这就是幂等性
- 在MQ中就是保障消息不要被重复消费。
业界主流的幂等性操作
乐观锁方案
借鉴数据库的乐观锁机制,如:
如何保障消息中间件100%消息投递成功?如何保证消息幂等性?根据version版本,也就是在操作库存前先获取当前商品的version版本号,然后操作的时候带上此version号。我们梳理下,我们第一次操作库存时,得到version为1,调用库存服务version变成了2;但返回给订单服务出现了问题,订单服务又一次发起调用库存服务,当订单服务传如的version还是1,再执行上面的sql语句时,就不会执行;因为version已经变为2了,where条件就不成立。这样就保证了不管调用几次,只会真正的处理一次。
Redis原子操作
利用redis的原子操作,做个操作完成的标记。这个性能就比较好。但会遇到一些问题。
第一:我们是否需要把业务结果进行数据落库,如果落库,关键解决的问题时数据库和redis操作如何做到原子性?
这个意思就是库存减1了,但redis进行操作完成标记时,失败了怎么办?也就是一定要保证落库和redis 要么一起成功,要么一起失败
第二:如果不进行落库,那么都存储到缓存中,如何设置定时同步策略?
这个意思就是库存减1,不落库,直接先操作redis操作完成标记,然后由另外的同步服务进行库存落库,这个就是增加了系统复杂性,而且同步策略如何设置