异步请求rails apache/phusionpassenger

异步请求rails apache/phusionpassenger,apache,asynchronous,ruby-on-rails-3.2,passenger,thin,Apache,Asynchronous,Ruby On Rails 3.2,Passenger,Thin,我已经实现了一个控制器方法,它向第三个parry API发出两个请求,速度非常慢。此外,我还利用了的一个异步功能: # This informs thin that the request will be handled asynchronously self.response_body = '' self.status = -1 Thread.new do # This will be the response to the client env['async.callback'].c

我已经实现了一个控制器方法,它向第三个parry API发出两个请求,速度非常慢。此外,我还利用了的一个异步功能:

# This informs thin that the request will be handled asynchronously
self.response_body = ''
self.status = -1
Thread.new do
  # This will be the response to the client
  env['async.callback'].call('200', {}, "Response body")
end

然而,我很好奇这是否可以在不使用Thin的情况下实现,或者更确切地说,是否可以通过Apache/phusionpasser实现


如有任何建议、指示、链接、评论或回答,我们将不胜感激。谢谢

我不确定乘客4现在是否可以这样做。年,他们宣布完成了一项全面的计划 重新设计以支持事件模型。由于他们也计划支持Node.js,我希望上面的方法能够工作

然而,如果你从他们的角度来看,他们清楚地说:

。。。不过,还有另一种支持高I/O并发性的方法:多线程

因此,在Rails应用程序中,多线程服务器是处理流式支持的唯一重要选择

Rails不是为事件化流程模型设计的,但是它非常好地支持多线程模型。并且可以通过客运企业实现多线程sutup

另一种选择可能是将此问题提取到另一个应用程序(请参阅)。 因此,例如,与直接调用控制器中的3d party api(这将花费大量时间阻止I/O调用)不同,您可以通过在回传作业中处理此请求来解决此问题。用户将得到一个immidate响应,然后直接订阅一些faye消息通道。在您的后台工作中,当3d party呼叫准备就绪时,您将在该频道上向faye发布响应。
利润。

接受这个答案似乎是一个合理的解决方案。但是,如果您只需要两个异步请求,那么就有点过头了。第二个选项实际上是otherkill。如果能看到一些puma/passenger企业多线程部署,那就太好了。然后,您可以完全执行阻塞io调用,并且您的应用服务器将暂停线程,直到io准备好处理,而不阻塞整个rails进程。Rails实际上声称是线程安全的,但由于Ruby在其整个生命周期中基本上没有关注并发性,因此没有人考虑过在gem生态系统中编写线程安全的代码。因此,第二种解决方案实际上是一个严肃的选择。我最终在多线程环境中使用了Puma和运行rails。取得了巨大的成功,尽管对于我构建的其他应用程序(没有费心转换现有的应用程序)