如何使用Rails有效地实现阻塞调用,同时让客户端等待回复

时间:2010-06-10 16:44:39

标签: ruby-on-rails web-services webserver

我们有一个用Rails编写的Web服务。 API已发布,我们无法对其进行更改。我们的应用程序与远程Web服务进行通信,该服务有时会挂起或需要几秒钟才能回复。

 Client -> Our Web Service -> Remote Web Service

目前,如果远程Web服务挂起5秒钟,我们的Web服务上的一个rails进程也会挂起,这是我们需要避免的。

我已经看过诸如mod-x-sendfile,modporter和延迟作业之类的东西,但我能说的最好,他们都假设客户端没有等待答案。由于API已经建立,我们无法告诉客户“我正在尝试做你想做的事情,请稍后再回来查看答案。”

到目前为止,我们提出的最佳选择是添加第二个运行eventmachine的非rails web服务器来处理这些特定的调用。还有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

如果您将作业卸载到delayedJobs或eventmachine,您的网络服务器可以继续工作。然后为了确保客户端执行忙等待(被阻止),您可以使用ajax / javascript并检查一些URL以查看作业是否已完成。假设在成功完成后,您可以设置或更改某些内容,以便显示结果。

另一种方法是使用juggernaut将结果推送回客户端。

答案 1 :(得分:0)

我不明白你想要什么。一开始,您似乎在询问如何使阻止远程呼叫无阻塞,但随后您声明您希望阻止客户直到呼叫返回。我不确定你是否可以双管齐下。

为什么不直接将阻止呼叫转储到延迟作业之类的东西,然后使用AJAX将答案发回给用户。或者只是通过AJAX进行整个调用。至少,对于用户来说,这将删除页面刷新并让他们凝视空白页面5或10秒。