谷粒商城/下单业务

274 接口幂等性讨论

支付流程

提交订单,模拟网速很慢,用户多次提交订单,插入多份,订单的防止重复提交。
幂等性,一次和一百次结果都是一样的。

无论是表单提交,还是互相调用,同一个方法都会调用多次。

微服务相互调用,网络问题,导致请求失败,feign触发重试机制。


什么情况需要幂等

查询是天然幂等,
更新sql,无论执行多少次,状态都是一样的。
删除
指定主键插入。
更新一个数据,每次执行的结果都会变化,不是幂等的。

订单号添加索引,唯一约束。
在数据库设计级别。

解决机制

令牌机制
哪些需要幂等的业务,添加令牌。
令牌的危险:怎么验证令牌,
后删令牌,出问题。必须先删令牌,
令牌对比成功,先删除令牌,再执行业务。危险性,令牌在分布式系统,存放在redis,从redis获取token,假设两次请求同时拿redis,同时拿到,所以要保证从redis获取令牌,对比,删除令牌必须是一个原子性操作。
分布式锁,占坑与设置过期时间是一个原子操作/

各种锁机制
数据库乐观锁/悲观锁/

业务层分布式锁
多台机器定时任务同时拿到了相同的数据处理,加分布式锁,锁定这个数据,处理完释放锁。获取到锁必须先判断这个数据是否处理过。


redis set防重
文件计算Md5 存在了,不用

防重表

全局请求唯一id
为每个请求制作一个id


275 订单确认页完成

先生成令牌
防重令牌 使用UUID
confirmVo.setOrderToken(token);
redisTemplate.opsForValue.set(token);

276 原子验令牌


submitOrder()

String script="";

String orderToken=vo.getOrderToken();
//原子验证令牌和删除令牌
redisTemplate.execute();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值