分布式幂等性

编程

幂等性:一个接口运行多次,与运行一次的效果是一样的


update t_reps set count=count-1,version=version+1
where version=1

1.购买手机的时候,先查询库存,剩1件,假如当前如version为1
2.更新的时候version+1,count-1
3.同是有新数据语句的时候,version已经等于2的时候,不为1,则不操作

消费端幂等性保证

唯一id+指纹码,利用数据库主键去重
select count(1) from t_order where id=唯一id+指纹码
(好实现,高并发有数据库写入性能瓶颈,解决:跟进id进行分库分表进行算法路由)

利用redis原子性
使用redis进行幂等,
1.是否进行数据库落库,如果落库的话,关键解决问题是,数据库和缓存如何做到原子性?
2.如果不落库,那么都存储在缓存中,如何设置定时同步策略。

接口幂等性

1.select操作:不会对业务数据有影响,天然幂等

2.delete操作:第一次已经删除,第二次不会影响

3.update操作:更新操作传入版本号,课题通过乐观锁实现幂等性

4.insert操作:此时没有业务单号,使用token保证幂等


混合操作:找到操作的唯一的业务单号,有则可使用分布式锁,没有可以使用token保证幂等性。

delete:根据唯一的业务号删除
        第一次删除时,已经将数据删除
        第二次再次执行时,由于找不到记录,所有返回结果是0,对业务数据没有影响,可在删除之前进行数据查询。


        删除操作没有业务号,则要看具体的业务需求
        列如:删除所有审核未通过的商品
        第一次执行,将所有未通过审核的商品删除
        在第二次执行之前,又有新的商品未审核通过
        执行第二次删除操作,是否需要删除新未审核的商品删除操作

update:根据唯一业务号去更新数据情况
        用户查询修改的数据,系统将数据返回页面,将数据版本号放入隐藏域
        用户修改数据,点击提交,将版本号一同提交给后台
        后台使用版本号作为更新条件
        update set version=version+1,xxx=${xxxx} where id=xxxx
        and version=${version}
        

        更新操作没有业务唯一业务号,可以使用token机制


 insert: 有唯一的业务号(手机号码:注册的时候)的insert操作 列如:秒杀,商品id+用户id。
         可以通过分布式锁,保证接口的幂等。
         业务执行完成后,不进行锁释放,让其过期自动释放。

         ----(手机号码:注册的时候)  可以通过Redisson  zookeepter 实现-------


         没有唯一业务号的insert操作,比如:用户注册,点击多次
         使用token机制,保证幂等性
         进入到注册页面时,后台统一生成token,返回前台隐藏域中
         用户点击提交的时,将token一同传入后台,
         使用token获取分布式锁,完成insert操作。
         执行完成之后,不释放锁,等待过期释放
         ----(1.请求页面之前,生成token,前端隐藏token,提交携带token) 
              2.insert之前判断token是否存在,
              3.可以通过Redisson,zookeepter 实现)------

 混合操作的幂等性 :混合操作,一个接口包含多个操作。
                  同样使用token机制,


//下单之前 生成token 存入redis
token=UUID.randomUUID.toString();
redisUtils.Set("ORDER_TOKEN_"+session.getId(),token,30); //key="ORDER_TOKEN_"+session.getId()  value=token 30s有效期


         
//生成订单+分布式锁Redisson(防止并发情况下)
获取token
redis获取是否存在一致
验证完成之后清除token

以上是 分布式幂等性 的全部内容, 来源链接: utcz.com/z/517078.html

回到顶部