如何在后台处理交易时向用户显示“您的付款正在处理...”页面?

Posted

技术标签:

【中文标题】如何在后台处理交易时向用户显示“您的付款正在处理...”页面?【英文标题】:How to display a 'your payment is processing...' page to a user while processing the transaction in the background? 【发布时间】:2012-05-21 13:51:36 【问题描述】:

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

解决此问题的一种方法是使用 Resque 在后台处理付款。网络服务器会立即向用户返回一个响应,例如“您的付款正在处理中……”网络服务器将能够继续下一个网络请求。

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

感谢您的意见。即使我要为可以处理无限数量的并发连接的东西切换 Web 框架,当支付网关需要异常长的响应时间时,我仍然会遇到一些请求超时的问题。我已经在生产服务器上运行了 Resque。我不知道的唯一部分是如何设置页面流,以便“处理...”页面最终转换为“完成”或“拒绝”页面。也许是 JavaScript,然后在 JavaScript 不起作用时回退到元刷新标签?【参考方案2】:

你试过 Gearman 吗?

http://gearman.org/

【讨论】:

谢谢!我正在使用 Resque,这是一个非常相似的后台作业系统。 github.com/defunkt/resque【参考方案3】:

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

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

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

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

所有这些方法都可以消除您对支付服务器处理交易所花费时间的担忧。如果您的服务器端出现问题,则需要解决另一个问题。

【讨论】:

【参考方案4】:

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

您对 AJAX 所做的任何事情都会占用服务器以响应 AJAX 请求。同样的问题。除非请求只是以“足够低但不太低”的频率轮询结果。轮询比通知更难看。

【讨论】:

以上是关于如何在后台处理交易时向用户显示“您的付款正在处理...”页面?的主要内容,如果未能解决你的问题,请参考以下文章

如何在启动 net.exe 时向用户显示错误代码

当应用程序在后台时向用户发送通知

如何在每次循环迭代时向用户打印不同的语句?

如何在登录时向HttpContext用户添加声明

Delphi 程序终止时向用户显示消息

关闭页面时向后台发送消息