## 什么是幂等性
一次和多次请求某一个资源应该具有同样的副作用(对资源变更带来连锁反应或影响):f(x) = f(f(x))。
## 为什么要幂等性设计
系统解耦后,系统间服务调用存在三种状态:
* 成功
* 失败
* 超时(中间状态)
前面两种是明确的,超时是不知道什么状态,一般引起原因:
* 请求没有到达服务方(网络延时或丢失)
* 请求达到了服务方,服务方处理超时
* 请求到达了服务方并且处理完返回结果,但接收方没有收到
相关例子:订单创建、库存扣减、订单支付
## 怎么做幂等性设计
* 下游提供查询接口,上游对于状态疑异订单进行查询
* 下游系统坐幂等性设计:确保不会重复
* 全局ID:Twitter的Snowflake算法/UUID
* 存储冲突来解决(唯一约束)
* 插入重复无效,`insert into … values … on DUPLICATE KEY UPDATE …`
* 更新状态:`update table set status = “paid” where id = xxx and status = “unpaid”;`
- HTTP幂等性
- 只有POST需要特殊处理,其他都具有幂等性:
- 前端生成token,后端存(唯一约束)
- PRG模式
展开