幂等性
用户对同一操作发起的一次请求或者多次请求的结果是一致的 如:用户多次点击按钮,用户回退再提交,微服务互相调用,网络原因,导致失败,触发feign重试机制等
解决方案:
1.token机制,服务端提供发送token接口,服务器保存token在redis,前端发送请求带上token与服务端保存的对于,一致则完成。完成后销毁。 如:验证码 但是会产生删token问题,不管先删token再执行业务,还是后删,因为不是原子操作,会有危险性,所以为了保证原子性,需在redis使用lua脚本保证操作是在一起的
2.各种锁机制,数据库悲观锁 select *from xxx where id=1 for update 一般随着事务一起使用
数据库乐观锁 适合用在更新场景中,处理读多写少
业务层分布式锁 加分布式锁锁定数据,处理完后释放锁,获取到锁必须先判断这个数据是否处理过
3.各种唯一约束
数据库唯一约束:按照唯一索引插入,相同订单不可能有两条记录插入,防重
redis set防重:计算数据MD5将其放入redis,每次处理,先看看md5是否存在,存在不处理
4.防重表
使用订单做去重表唯一索引,把唯一索引插入表,再业务操作且在同一事务,即使业务失败,也会回滚
5.全局请求唯一id
调用接口生成唯一id,redis将数据保存到集合中,存在即处理过