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();