我的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中,我会使用线程来完成同样的任务。
感谢您的帮助!
答案 0 :(得分:3)
您可以告诉delayed_job每秒轮询数据库,以便快速执行作业。然后使用数据库中的列来轮询结果。
示例:
这会给用户提供反馈,让他们在不考虑超时的情况下等待。
答案 1 :(得分:0)
我们使用了delayed_job,效果很好。如果您不必显示合作伙伴api的返回值,delayed_job似乎是一个很好的解决方案。您可以使用delayed_job的send_later功能将任何方法调用到delayed_job中。您也可以在delayed_job中配置工作人员数量,并确定您获得正确响应的时间点。
巴勒特