1.1. 幂等性
表达的是N次变换与1次变换的结果相同
1.2. Http 维度
::: alert-info
从定义上看,Http方法的幂等性是指一次和多次调用某一个资源应该具有相同的副作用.
:::
1.2.1. GET 方法
HTTP Get 方法用于获取资源,不应有副作用
1.2.2. 后台解决接口幂等性问题
-
token + 分布式锁
-
状态机幂等性
:::alert-info
针对更新操作,比如业务上需要订单状态,订单有 待支付,支付中,支付成功,支付失败,订单超时关闭灯,在设计时最好支持状态的单向改变(不可逆),这样在更新时where条件里加上status= 我期望的原来的status, 多次调用的话实际上也只会执行一次.
update xxx set xxx=xxx where status = 'daizhifu' and id=xxx
:::
- 乐观锁
-
如果更新已有数据,可以进行加锁更新,也可以设计表结构时使用乐观锁,通过version来做乐观锁,这样保证执行效率,又能保证幂等性。乐观锁的version版本在更新业务数据时要自增。
-
也可使用
update with condition
, 更新带条件,实现乐观锁,通过version或者其他条件实现乐观锁。
-
- 防重表实现幂等性
- 增加一个防重复表 ,利用数据实现分布式锁
- select + insert 实现幂等性
- 该方案就是在操作前先查询一下,灯符合要求再插入,该方案在没有并发的系统中可以解决幂等性问题,在但JVM有并发的时候可以JVM加锁来保证幂等性,在分布式环境无法保证幂等性,可以使用分布式锁来保证。
- 分布式锁保证幂等性
-
进入方法时,先获取锁,加入获取到锁,就继续后面的流程。加入没有获取到锁,就等待锁的示范指导获取到锁,当执行完方法是,释放锁,当然,锁要设置个超时,防止意外没有释放,它可以用来解决分布式系统的幂等性。
-
常规的分布式锁方案是radis和zookeeper等工具。
-
- 缓冲队列
- 将请求都快速接收,放入缓冲队列,后续使用异步任务处理队列中的数据,过滤掉重复请求,此方式有点事铜鼓该异步处理,高吞吐,不足是不能及时处理返回结果,需要后续轮询处理结果。
- 全局唯一号实现幂等性