在Rails中处理大量对合作伙伴API的实时调用

时间:2010-01-23 05:16:01

标签: ruby-on-rails api asynchronous timeout

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

我的Rails应用程序在请求/秒方面遇到,因为每个mongrel都被阻止,直到合作伙伴API返回响应。在最近的一次性能测试中,我看到一台服务器仅售出5个请求/秒(运行5个mongrels)。

我对如何做有一些想法:

1)让合作伙伴API更快地响应。实际上,我只能拉这个杠杆 - 即使合作伙伴真的很努力,平均响应时间也是200毫秒。

2)限制我等待合作伙伴API返回的时间。我尝试使用Rails :: Timeout,但它只允许等待一段时间的倍数。有没有办法让超时发生在毫秒之内呢?

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

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

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

示例:

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

    这会给用户提供反馈,让他们在不考虑超时的情况下等待。

答案 1 :(得分:0)

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

巴勒特