1. 什么是幂等
如果一个操作执行任意多次所产生的影响,均与执行一次的影响相同,我们就称其为幂等。
2. 幂等的重要性
系统的API 具备幂等性非常重要。举一个简单的例子。
比如,在一次付款的交易中,正常流程是这样:
- 客户端向支付平台发送付款请求;
- 支付平台收到付款请求,处理转账操作成功后,返回一个回执消息表示交易完成;
- 客户端收到回执消息,知道付款成功了。
服务间的调用可能会有三个状态:成功,失败,超时。
前两者都是明确的状态,而超时则是完全不知道是什么状态。
如果发出付款请求后,请求超时,客户端再也没有收到关于这个请求是成功还是失败的回执,会发生什么?
这里有多种可能的情况:
- 请求在到达支付平台前就已经发生超时,支付平台从来没有收到请求。
- 请求到达支付平台,但是支付交易失败,这时发生超时,支付平台收到了请求,但没有处理成功。
- 请求到达支付平台,并且支付交易成功,这时发生超时,支付平台收到了请求,处理成功,但是没有发出回执。
- 请求到达支付平台,并且支付交易成功,也发出了回执,但是因为网络原因回执丢失,客户端没有收到。
在实际中,客户端面对超时的情况,最常见的做法就是:重新发起一次支付请求。
但是这样做会有一个不确定的问题:请求超时是上面的哪一种情况,会不会引发多次支付的可能性?
对于这种问题,一般有两种处理方式:
- 需要服务端提供相应的查询接口。客户端在超时后去查询一下。如果查到了,就表明已经做了,成功了就不用做了,失败了就走失败流程。
- 通过幂等性的方式。也就是说,把这个查询操作交给服务端,客户端只管重试,客户端保证一次和多次的请求结果是一样的。
对于第一种方式,需要服务端提供一个查询接口来做配合。而第二种方式则需要服务端提供支持幂等性的交易接口。
3. 幂等的实现
幂等的含义是,多次执行所产生的影响均与一次执行的影响相同。那么服务端,需要一个去重的机制。这里有很多不同的实现方法,但是有两个很关键的因素。
第一个因素是全局ID
客户端和服务端通过什