【发布时间】:2018-06-12 13:32:57
【问题描述】:
我使用Slim 和Stripe's PHP Library 在我的应用程序中处理付款。
一切都很好,但是直到最近,我发现我的系统中存在一个令人担忧的故障,我认为这可能是一个比我想象的要大得多的问题。在我的逻辑中,在支付流程的三个独立检查点,我检查了我的(MySQL)数据库中的库存,以确保用户购买的产品没有超过可用的数量。
但是,当多个用户在大约 500 毫秒 内发出请求时,支付系统似乎会同时处理这些请求,从而导致一系列问题,包括库存不正确和不平衡,对成功付款的虚假用户确认。
通过一些尽职调查,我将解决方案缩小到两个选项(尽管我可能会卖空自己):
1) 使用Queueing System,据我了解,它将对这些请求进行排队并一次处理一个,创建先到先得的排序原则。
2) 将一些中间件附加到每个请求上,这些中间件将充当队列并尝试同步处理每个请求(尽管这可能与我已有的类似)
话虽如此,对这些选项有什么建议/意见吗?显然,您可以完全放弃我的理念,为我指明不同的方向。
【问题讨论】:
-
我绝对认为具有某种实时确认请求已处理的排队系统是解决此问题的完全有效的方法。如果我分享了您的担忧,我会使用与 websocket 相结合的排队系统,它告诉我的前端后端已经从头到尾处理了请求。这也给你带来了很多很酷的好处——重试、响应能力、对比特币等事物的异步处理等。不过,Stripe 也是同步的,所以你总是可以在处理完付款后定期进行清理以确保你的库存在那里。
-
你应该考虑使用事务。还要确保您的数据库已正确索引并且可能具有(另一个)唯一索引。您使用的是哪个 RDBMS?记得@Niner me。
-
使用 MySQL @Funk Forty Niner
-
@JaredGarcia 好的,谢谢。那么您如何看待使用交易?你有没有考虑过,还是我完全错过了目标?
-
@JaredGarcia 那么,您的数据库确实被正确索引了吗?这个问题(对我来说)听起来更像是与数据库相关而不是特定于 Stripe 的问题。似乎没有人解决这个问题,至少没有看到一个公认的答案。所以从某种意义上说,你的问题可能是基于意见的,而且过于广泛,但对我来说还不清楚。也许我可能也没有抓住这个问题,而且我还远远不够。
标签: php queue stripe-payments payment-gateway payment