【问题标题】:Dealing with high number of real-time calls to partner API in Rails在 Rails 中处理对合作伙伴 API 的大量实时调用
【发布时间】:2011-01-08 11:55:45
【问题描述】:

我的 Rails 应用需要针对特定​​控制器操作收到的每个请求调用合作伙伴的 RESTful API。我需要将特定于请求的参数(例如 IP、用户代理等)传递给合作伙伴 API,并将我得到的响应返回给用户。由于对合作伙伴 API 的调用非常特定于用户,因此我无法缓存从合作伙伴 API 返回的响应(例如,在 memcached 中)。我的要求是在 1500 毫秒或更短的时间内响应用户。

我的 Rails 应用程序在每秒请求数方面遇到了墙,因为每个 mongrel 都会被阻塞,直到合作伙伴 API 返回响应。在最近的一次性能测试中,我看到一台服务器每秒只能勉强 5 个请求(运行 5 个 mongrel)。

我有一些关于该怎么做的想法:

1) 让合作伙伴 API 响应更快。实际上,我只能拉这么多——即使合作伙伴非常努力,平均响应时间也是 200 毫秒。

2) 限制我等待合作伙伴 API 返回的时间。我尝试使用 Rails::Timeout,但它只允许以秒为单位的等待时间。有没有办法让超时以毫秒为单位?

3) 有没有办法对合作伙伴 API 的调用进行排队,让它们异步执行?在 Java 中,我会使用线程来完成相同的任务。

感谢您的帮助!

【问题讨论】:

  • 关于#3:有人推荐使用delayed_job吗?我可以依靠它在一定的时间间隔内处理作业吗?

标签: ruby-on-rails api asynchronous timeout


【解决方案1】:

您可以告诉delayed_job 每秒轮询一次数据库,以便快速执行该作业。然后使用数据库中的列来轮询结果。

例子:

  1. 将作业添加到延迟作业中
  2. 将用户重定向到结果页面
  3. 显示某种进度指示器(可能是圆圈箭头)
  4. 每秒通过一个操作轮询数据库列/行/任何结果

这会给用户反馈,让他们等待而不用考虑超时。

【讨论】:

  • 是的,如果您受限于仅使用标准 Rails 堆栈,这就是答案。如果您要冒险并仅研究第 4 步的异步事件堆栈,您可以将 4 变成一个仅在合作伙伴 API 响应时返回的 Ajax 调用。没有什么东西可以很快掀起,因为这些东西是相当新的。下一条评论中的一些链接...
  • Event Machine - 滚动你自己的 rubyeventmachine.com Cramp - m.onkey.org/2010/1/7/introducing-cramp Chat-Server - 以及使用 EM 进行长轮询的示例 github.com/tobi/chat-server
  • Jamie(和 glongman)感谢您的清晰回应! Jamie,您能否确认以下场景是否适用于delayed_job(我认为它会:D)1)控制器的操作获取请求2)操作创建一个delayed_job并呈现一个响应,告诉客户端“等待响应”3 )delayed_job 在一定的时间间隔内运行(这个保证对我来说很重要),或者如果它不能在这段时间内运行,它就会失败。 4)客户端定期调用一个动作来查看响应是否准备好另外,我可以告诉delayed_job以毫秒而不是秒来轮询数据库吗?
  • 我不确定你是如何设置delayed_job 检查时间的,它默认设置为“5 秒内”,但毫无疑问你可以改变它。然后只需确保使用 :send_later 触发的延迟作业设置一个带有结果的数据库列(通过/失败/whatever_you_need)并使用 ajax 运行器对其进行轮询。
  • github.com/tobi/delayed_job/blob/master/lib/delayed/worker.rb 我猜你可以将 SLEEP_TIME 调整为 1 秒。
【解决方案2】:

我们使用了delayed_job,它运行良好。如果您不必显示合作伙伴 api 的返回值,delayed_job 似乎是一个不错的解决方案。您可以使用delayed_job 的send_later 功能将任何方法调用到delayed_job。您也可以在 delay_job 中配置工作人员的数量,并确定您在什么时候获得正确的响应。

巴拉特

【讨论】:

  • 要求是显示来自合作伙伴 API 的返回值 - 所以在这种情况下,delayed_job 听起来不会削减它。为什么延迟作业不能像控制器的动作一样呈现响应?
  • 问题是delayed_job 在请求上下文之外运行。到delayed_job 完成时,不再有请求呈现响应。那艘船已经航行了。
  • 您仍然可以连接通过延迟作业传入的响应。对于您发送到合作伙伴站点的每个请求,请通过作业执行,并在创建作业时将 ID 传递给它。当它运行并返回结果时,您可以使用 id 将响应插入到正确的位置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-18
  • 1970-01-01
  • 2013-06-02
  • 2023-01-23
  • 1970-01-01
  • 2013-04-29
相关资源
最近更新 更多