我们有一个用Rails编写的Web服务。 API已发布,我们无法对其进行更改。我们的应用程序与远程Web服务进行通信,该服务有时会挂起或需要几秒钟才能回复。
Client -> Our Web Service -> Remote Web Service
目前,如果远程Web服务挂起5秒钟,我们的Web服务上的一个rails进程也会挂起,这是我们需要避免的。
我已经看过诸如mod-x-sendfile,modporter和延迟作业之类的东西,但我能说的最好,他们都假设客户端没有等待答案。由于API已经建立,我们无法告诉客户“我正在尝试做你想做的事情,请稍后再回来查看答案。”
到目前为止,我们提出的最佳选择是添加第二个运行eventmachine的非rails web服务器来处理这些特定的调用。还有更好的方法吗?
答案 0 :(得分:2)
如果您将作业卸载到delayedJobs或eventmachine,您的网络服务器可以继续工作。然后为了确保客户端执行忙等待(被阻止),您可以使用ajax / javascript并检查一些URL以查看作业是否已完成。假设在成功完成后,您可以设置或更改某些内容,以便显示结果。
另一种方法是使用juggernaut将结果推送回客户端。
答案 1 :(得分:0)
我不明白你想要什么。一开始,您似乎在询问如何使阻止远程呼叫无阻塞,但随后您声明您希望阻止客户直到呼叫返回。我不确定你是否可以双管齐下。
为什么不直接将阻止呼叫转储到延迟作业之类的东西,然后使用AJAX将答案发回给用户。或者只是通过AJAX进行整个调用。至少,对于用户来说,这将删除页面刷新并让他们凝视空白页面5或10秒。