如何在后台处理交易的同时向用户显示'your payment is processing...'页面?



我经营着一家流量非常高峰的在线商店。 最近,由于支付网关存在某种问题,整个系统在大型销售活动中陷入停顿,来自其API的响应需要17秒才能响应,而不是正常的2-3秒。 有数百人同时尝试购买。 这导致生产集群中每个 Web 服务器中的所有 Web 工作线程都被占用,等待来自支付网关的 API 响应。 整个生产集群被锁定,无法提供任何页面。

解决此问题的一种方法是使用Resque在后台处理付款。 Web 服务器会立即向用户返回响应,该响应会说:"您的付款正在处理中..." Web 服务器将能够转到下一个 Web 请求。

问题是在处理付款后继续结帐。 我不能使用 AJAX 轮询事务是否已完成,因为许多客户没有 JavaScript。 我不能依赖它。 我不想使用可靠性低的JavaScript或任何类型的服务器推送技术,因为如果一定比例的结帐在"处理......"上停滞不前,这将产生昂贵的客户支持问题。页。

如何设计页面流,以便可以在后台可靠地处理事务?

研究一个基于事件的解决方案(例如 EventMachine(,并让它处理这些请求。 在这种情况下,标准 RoR 服务器将全部崩溃。 使用 javascript 进行某种后端处理绝对是解决此问题的最简单方法,但如果这不是一种选择,我会探索将该流程转移到更好地设计用于处理 API 永远没有响应之类的事情。

你试过Gearman吗?

http://gearman.org/

我知道你说过你不能依赖启用了Javascript的客户端,但我不相信在没有客户端脚本的情况下尝试实现这一目标是不优雅的。

  1. 例如,您可以强制用户继续单击刷新按钮以生成HTTP请求,以从服务器拉回支付交易的状态("正在处理","成功"或"失败"(,直到完成,但它很笨拙。

  2. 或者,为了获得更好的体验,请使用元刷新指令来自动刷新,但它仍然使您的网站看起来过时:

  3. 但我强烈倾向于使用客户端行为。使用它可立即更改显示。使用您选择的AJAX库,JQuery或Javascript。操纵 DOM 以仅显示"处理"消息。或者,如果将现有页面元素保留在此处,请确保禁用表单的每个按钮或其他可提交部分,以防止用户双击。并警告用户付款需要几秒钟。处理付款后,HTTP 响应将到达以推进屏幕,以显示付款失败或成功。

所有这些方法都应该消除您对支付服务器处理交易所花费时间的担忧。如果您的服务器端出现问题,那么这是一个需要解决的不同问题。

是的。 回复"正在进行中,我们将向您发送电子邮件确认"。 让后台进程发送带有链接的电子邮件,并标记指示结果的记录。 然后,客户可以回来查看,或等待电子邮件并回来查看。

您使用 AJAX 执行的任何操作都会占用响应 AJAX 请求的服务器。 同样的问题。 除非请求只是以某种"足够低但不太低"的频率轮询结果。 轮询比通知更丑陋。

相关内容

最新更新