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

时间:2012-05-14 03:33:27

标签: ruby-on-rails payment-gateway payment resque

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

此问题的一个解决方案是使用Resque在后台处理付款。 Web服务器会立即向用户返回一个响应,例如“您的付款正在处理......”Web服务器将能够转到下一个Web请求。

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

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

4 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

你有没有尝试过Gearman?

http://gearman.org/

答案 2 :(得分:0)

我知道你说你不能依赖启用Javascript的客户端,但我不相信没有客户端脚本就可以实现这一点。

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

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

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

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

  4. 所有这些方法都应该抵消您对付款服务器处理交易所花费时间的担忧。如果您的服务器端出现问题,则需要解决其他问题。

答案 3 :(得分:0)

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

使用AJAX执行的任何操作都会占用服务器来回答AJAX请求。同样的问题。除非请求只是在一些“足够低但不太低”的频率上轮询结果。轮询比通知更加丑陋。