3

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

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

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

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

4

4 回答 4

0

你试过Gearman吗?

http://gearman.org/

于 2012-05-14T18:24:55.937 回答
0

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

于 2012-05-14T03:49:32.430 回答
0

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

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

于 2012-06-23T23:29:10.400 回答
0

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

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

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

    <meta http-equiv="refresh" content="2; url=http://site.com/checkout/?session=123" />

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

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

于 2012-05-15T06:20:00.563 回答