幂等
对外提供的接口承诺幂等性,其要表达的含义是:只要调用接口成功,外部对接口的多次调用得到的结果是相同的。即执行多次和一次的效果是一样的。
业务开发中,经常会遇到重复提交的情况,无论是由于网络问题无法收到请求结果而重新发起请求,或是前端的操作抖动而造成重复提交情况。幂等接口认为,外部调用者会存在多次调用的场景,为了防止重试对数据状态的改变,需要将接口的设计为幂等的。
幂等策略
幂等需要通过唯一的业务单号来保证。也就是说相同的业务单号,认为是同一笔业务。使用这个唯一的业务单号来确保,后面多次的相同的业务单号的处理逻辑和执行效果是一致的。
通过幂等(Idempotent)模式处理重复的消息,基本处理思路是:
- 调用者给消息一个唯一请求ID标识。ID标识一个工作单元,这个工作单元只应执行一次,工作单元ID可以是Schema的一部分,也可以是一个定制的SOAP Header,服务的Contract 可以说明这个唯一请求ID标识是必须的;
- 接收者在执行一个工作单元必须先检验该工作单元是否已经执行过。检查是否执行的逻辑通常是根据唯一请求ID ,在服务端查询请求是否有记录,是否有对应的响应信息,如果有,直接把响应信息查询后返回;如果没有,那么就当做新请求去处理。
业务系统实现幂等的通用方式
先识别出幂等和非幂等操作。有些操作是天然幂等的,譬如数据库查询操作。
然后是一般是排重表校验。
考虑如下场景:在一个面向交易的分布式应用中,支付子系统完成了支付功能,支付子系统通知订单子系统,通知的方式无非是调用订单子系统的一个函数f而已,只是调用的方式分为同步和异步。无论是同步还是异步,f都可能存在超时,所以为了支持重试,f必须是幂等的。f会首先根据传入的订单号来查找订单,检查订单状态。如果是已经支付,就会直接返回成功。如果是待支付状态,那么会尝试锁定(悲观锁和乐观锁)订单,修改状态,指定其他操作,其中锁定只是为了防止并发操作。
参考资料
流年素心
http://www.cnblogs.com/lddbupt/