幂等性

1. 什么是幂等

如果一个操作执行任意多次所产生的影响,均与执行一次的影响相同,我们就称其为幂等。

 

2. 幂等的重要性

系统的API 具备幂等性非常重要。举一个简单的例子。

比如,在一次付款的交易中,正常流程是这样:

  1. 客户端向支付平台发送付款请求;
  2. 支付平台收到付款请求,处理转账操作成功后,返回一个回执消息表示交易完成;
  3. 客户端收到回执消息,知道付款成功了。

 

服务间的调用可能会有三个状态:成功,失败,超时。

前两者都是明确的状态,而超时则是完全不知道是什么状态。

如果发出付款请求后,请求超时,客户端再也没有收到关于这个请求是成功还是失败的回执,会发生什么?

 

这里有多种可能的情况:

  1. 请求在到达支付平台前就已经发生超时,支付平台从来没有收到请求。
  2. 请求到达支付平台,但是支付交易失败,这时发生超时,支付平台收到了请求,但没有处理成功。
  3. 请求到达支付平台,并且支付交易成功,这时发生超时,支付平台收到了请求,处理成功,但是没有发出回执。
  4. 请求到达支付平台,并且支付交易成功,也发出了回执,但是因为网络原因回执丢失,客户端没有收到。

 

在实际中,客户端面对超时的情况,最常见的做法就是:重新发起一次支付请求。

但是这样做会有一个不确定的问题:请求超时是上面的哪一种情况,会不会引发多次支付的可能性?

对于这种问题,一般有两种处理方式:

  1. 需要服务端提供相应的查询接口。客户端在超时后去查询一下。如果查到了,就表明已经做了,成功了就不用做了,失败了就走失败流程。
  2. 通过幂等性的方式。也就是说,把这个查询操作交给服务端,客户端只管重试,客户端保证一次和多次的请求结果是一样的。

 

对于第一种方式,需要服务端提供一个查询接口来做配合。而第二种方式则需要服务端提供支持幂等性的交易接口。

 

3. 幂等的实现

 

幂等的含义是,多次执行所产生的影响均与一次执行的影响相同。那么服务端,需要一个去重的机制。这里有很多不同的实现方法,但是有两个很关键的因素。

 

第一个因素是全局ID

客户端和服务端通过什

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值