## 幂等性定义
**幂等性是系统服务对外一种承诺,承诺只要调用接口成功,外部多次调用对系统的影响是一致的。幂等性并不是所有的接口都需要的。**
如果把操作按照功能分类,那就是增删改查四种,在 http 协议中则表现为 Get、Post、Put、Delete
* Get 方法用于获取资源,不应当对系统资源进行改变,所以是幂等的。
* Delete 方法用于删除资源,虽然改变了系统资源,但是第一次和第N次删除操作对系统的作用是相同的,所以是幂等的。
* 修改操作有可能是幂等的也可能不幂等。
* Post 新增操作天生就不是一个幂等操作,其在 http 协议的定义如下:
> The POST method is used to request that the origin server accept the entity enclosed in the request as a **new subordinate**of the resource identified by the Request-URI in the Request-Line.
## 怎么出现的
1. 前端重复提交:提交订单,用户快速重复点击多次,造成后端生成多个内容重复的订单。
2. 接口超时重试:对于给第三方调用的接口,为了防止网络抖动或其他原因造成请求丢失,这样的接口一般都会设计成超时重试多次。
3. 消息重复消费:MQ消息中间件,消息重复消费。
## 如何解决
1. token机制
![](https://img.kancloud.cn/a7/a4/a7a43f3fbc358f75093e6e709f58d5c7_732x431.png)
2. 状态机
主要思路就是通过状态标识的变更,保证业务中每个流程只会在对应的状态下执行,如果标识已经进入下一个状态,这时候来了上一个状态的操作就不允许变更状态,保证了业务的幂等性。
比如订单支付成功后,就把订单标识为修改为支付成功,现在再次调用订单支付或者取消接口,会先判断订单状态标识,如果是已经支付过或者取消订单,就不会再次支付了。
3. 唯一ID,比如订单号
![](https://img.kancloud.cn/a4/c1/a4c1fbf013b2ae629498a5e6a43d3f2d_732x424.png)
## 总结
通过以上的了解我们可以知道,唯一id是一个更好的解决方式。
幂等性是开发当中很常见也很重要的一个需求。尤其是金融、支付等行业对其要求更加严格,既要有好的性能也要有严格的幂等性。除了对其概念的掌握,理解自身业务需求更是实现幂等功能的要点,必须处理好每一个结点细节,一旦某个地方没有设计完善,最后的结果可能仍旧达不到要求。
## 参考资料
> https://segmentfault.com/a/1190000020172463