实际开发中在接口设计的时候对于接口的幂等性问题一定要进行考虑的,现对这部分内容做一个梳理
英文单词:Idempotence,来源于数学,表达的是N次变换与一次变换的结果相同,简单来说就是一个接口多次调用没有副作用,它就具有幂等性
❇️如网络波动引起重复请求 ❇️如用户误操作导致的重复操作 ❇️应用使用了失败或超时的重试机制(如Nginx重试、RPC重试等) ❇️第三方平台的接口(如支付成功回调接口),因为异常导致多次异步回调 ❇️用户双击提交按钮 ❇️页面重复刷新 ❇️使用浏览器后退按钮重复之前的操作,导致重复提交表单 ❇️浏览器重复的http请求 ❇️定时任务重复执行
我们现在都是分布式、微服务架构,在哪一层进行幂等设计,在哪一层解决幂等性问题呢?
🚩在数据访问层实现是比较合适的
insert操作:这种情况下多次请求,可能会产生重复数据(如有时我们在填写某些form表单时,保存按钮不小心快速点了两次,表中竟然产生了两条重复的数据,只是id不一样)
update操作:如果只是单纯的更新数据,比如:update user set status=1 where id=1,是没有问题的。如果还有计算,比如:update user set status=status+1 where id=1,这种情况下多次请求,可能会导致数据错误
📌前端实现(不可靠)
📌后端实现
唯一索引去重,Token+Redis,乐观锁,分布式锁,全局唯一号等
这个部分需要展开学习说明
常用的http请求它的幂等性是怎样的
它不会对数据产生副作用