做网站好一点的公司,海尔网站建设不足之处,邹城做网站,穿衣搭配的网站如何做为什么扣了我两笔钱#xff1f;
2010年#xff0c;美国加利福尼亚州的两兄弟打算创办一家公司#xff0c;但他们发现建立网上支付十分困难。于是#xff0c;他们决定开发一款在线支付服务#xff0c;并将其命名为Stripe。 随着用户数量的不断增长#xff0c;重复付费问题…为什么扣了我两笔钱
2010年美国加利福尼亚州的两兄弟打算创办一家公司但他们发现建立网上支付十分困难。于是他们决定开发一款在线支付服务并将其命名为Stripe。 随着用户数量的不断增长重复付费问题逐渐显现。所谓的重复付费指的是对同一笔交易错误地向用户收取了两次甚至多次费用。可能造成重复付费的原因很多下面看一种典型的场景。
当客户端发送一个请求后服务器已成功处理该请求。但在返回响应给客户端之前由于网络故障导致响应没有成功发送给客户端。
但是客户端不知道请求已被成功处理它只要没收到响应就当作请求处理失败因此就会重试这种情况下就会出现重复付款。
除此之外框架的一些重试机制同样会导致重复付费。
幂等 API
为了解决重复付费问题他们决定采用最简单也是最有效的解决方案他们决定将API设计成幂等的。
幂等 API可以保证同一个请求可以重试多次且不会产生副作用。这意味着即使经过多次重试这些请求也只会被处理一次。Stripe 实现幂等 API 的方式如下
1.幂等key
幂等key是一个唯一的标识符用来标识每一次请求。通过使用幂等key服务器可以识别出同一个请求即使这个请求被重复发送多次也只会处理一次。
客户端比如用户的浏览器或手机应用发起支付请求时会生成一个唯一的字符串作为幂等key。这个字符串通常是一个UUID通用唯一标识符。此后客户端发送请求时需要将这个key随请求的 HTTP 头部一起发送。
POST /pay
Idempotency-Key: 123e4567-e89b-12d3-a456-426614174000
Content-Type: application/json
{amount: 100,currency: USD,card_number: 4111111111111111,expiry_date: 12/23,cvv: 123
} 服务端接收到请求后先检查这个幂等key是否已经存在于数据库或缓存中如果不存在说明这是一个新的请求服务器处理请求并将幂等key和响应结果一起缓存在数据库中如Redis。如果幂等key存在于数据库中说明这个请求之前已经被处理过了。服务器直接返回缓存中的处理结果而不再重复处理。
如果服务器在处理请求时发生错误他们会使用ACID数据库的事务回滚功能来撤销交易。幂等性key会在内存数据库中保留24小时这个时间根据自己业务确定以便在这个时间段内可以重试失败的请求。过了24小时后幂等性key会被移除这样可以减少存储成本并允许在这个时间段后重复使用同一个key。
为了帮助您理解我再举一个更具体的例子假设你正在用Stripe支付一笔费用但由于网络问题没有响应回来你以为付款失败了于是你就重新点击了一次支付按钮。 第一次请求服务器生成一个幂等性键 12345并处理这个请求。请求成功后响应会被缓存并且幂等性键 12345 被存储在内存数据库中。 第二次请求由于你不确定第一次是否成功所以又发了一次请求。这次请求带着相同的幂等性键 12345。服务器查询内存数据库发现这个请求已经处理过因此直接返回缓存的响应而不会再次处理请求。
2. 重试失败的请求
虽然使用幂等key之后重试变的安全了不会造成重复付费问题了但是过多的重试请求可能会导致服务器过载。 因此系统重试使用了指数退避算法每次重试之间的等待时间会逐次增加。
此外为了防止大量客户端同时发起重试请求导致服务器过载。还在指数退避的基础上给重试等待时间增加了随机时间这称为抖动。
为了更好的理解指数退避算法和抖动举两个例子来说明。
示例1指数退避
第一个例子是用来解释指数退避算法假如你在用Stripe支付但服务器暂时不可用导致请求失败。
第一次请求失败系统等待1秒后重试。第二次请求失败系统等待2秒后重试。第三次请求失败系统等待4秒后重试。依次类推等待时间逐次增加。
示例2抖动
这个例子是用来解释抖动。假设有很多用户同时在用Stripe支付服务器暂时不可用。
用户A的请求失败后系统会根据指数退避算法等待一段时间然后加上一个随机的额外等待时间。例如第一次等待1秒加0.5秒的随机时间总共1.5秒。用户B的请求失败后系统等待1秒加0.3秒的随机时间总共1.3秒。用户C的请求失败后系统等待1秒加0.7秒的随机时间总共1.7秒。
由于加入了抖动不同用户的重试时间就会有所不同这样可以防止服务器在同一时间受到大量重试请求的冲击从而减轻服务器的压力防止过载。
幂等性对于可靠的在线支付至关重要。它给系统带来了安全性和更好的用户体验。Stripe作为全球最大的在线支付服务提供商之一正是通过这样的方法确保其支付系统的可靠性和稳定性。