本系列文章全部从 https://blog.bytebytego.com/ 搬运,也包括些许总结和备注(以下划线字体区分)。
How to avoid double payment? - by Alex Xu
支付系统中常见的严重问题之一包括对客户重复收费(double charge),而在设计支付系统时,确保有且只有一次( exactly-once)收费显得非常重要。
从算术角度(Mathematically)来看,一次操作只发生一次需满足以下条件:
1,至少会执行一次(It is executed at least once.)。
2,与此同时,最多也就执行一次(At the same time, it is executed at most once.)。
以下分别解释
如何通过重试机制(retry)实现至少一次(at least once )。
如果通过幂等性校验(idempotency check)实现最多一次(at most once)。
Retry
上图Retry部分描述了Client发起一笔$10交易,但因为网络不畅/超时原因造成支付失败,则Client采用失败就重试的方式,终于在第四次网络环境变好的情况下,完成了交易。
Idempotency
从API角度出发,幂等性(idempotency)意味着客户端client可以重复提交请求,而服务端不会因为多次提交而受影响。
对于web和移动app这种客户端和服务器端的调用,许多公司包括Stripe and PayPal,采用在http header加入 idempotency key (一种由客户端产生,可以是订单编号,具有唯一性,固定时间会过期,格式<idempotency-key: key_value>)来由服务端判重,以区分是否是同一笔交易。