在计算机方面用来表示对同一个过程应用相同的参数多次和一次调用产生的效果是一样的,这样的过程被称为满足幂等性。系统接口对外的一种承诺,不用担心重复执行会对系统造成改变。
电商系统,支付系统中幂等性尤其重要!
(1)HTTP的幂等性
HTTP/1.1规范中幂等性的定义:
引用
Methods can also have the property of "idempotence" in that (aside from error or expiration issues) the side-effects of N > 0 identical requests is the same as for a single request.
https://tools.ietf.org/html/rfc2616#section-9.1.2
同一个请求,发送一次和发送多次效果一致。强调的是一次和N次效果(对系统的改变)是相同的,但不是每次的结果相同。
- GET, HEAD 幂等且安全
- PUT, DELETE 幂等但不安全
- POST 既不幂等也不安全
重复提交、定时任务、异步处理等都需要考虑幂等性。
(2)REST的冪等性
使用相同参数对同一资源重复调用的结果与调用一次的结果相同。一般,同一个URL返回的资源一定是一致的。
(3)分布式系统接口的幂等性
幂等性是分布式系统设计中十分重要的概念。
首先需要知道retry的必要性:
- -对方服务器宕机
- -对方程序负荷太高无应答
- -内存消耗太大无法立即处理
- -数据传输过程中出错
网络的不可靠性造成了系统间调用除了成功和失败外,有了第三个状态:超时。
(4)运维工具的冪等性
模块的执行具有幂等性。比如,自动化配置管理工具(Chef、Puppet、Ansible)
(5)如何保证幂等性
- 请求唯一标识(Synchronized Token、Idempotent Receiver)
- 事务(分布式事务)
- 锁表(MVCC多版本并发控制,采用乐观锁通过version或updateTime等条件保证更新操作)
- 消息队列
参考:
http://www.infoq.com/cn/news/2013/05/idempotent
http://www.cnblogs.com/weidagang2046/archive/2011/06/04/idempotence.html
http://frsyuki.hatenablog.com/entry/2014/06/09/164559