2011-11-27 24 views
0

我正在创建一个rails应用程序,我想知道是否可以在控制器层中设置异步/回调体系结构。我正在尝试执行以下操作:在rails控制器中使用回调进行并行异步处理

当对/ my_app/foo发出HTTP请求时,我想异步地将两个作业 - 一个天真的排名作业和一个复杂的排名作业,均列为1000个帖子 - 以几个工人机器。我想在控制器中为每个作业设置一个回调方法,当各个作业完成时调用它。如果复杂的作业在X毫秒内没有返回,我想返回来自天真作业的输出。否则,我想返回复杂作业的输出。

请务必注意,我希望这些作业能够并行执行。在Rails中实现这样一个系统的最佳方式是什么?如果有帮助,我使用Apache Phusion Passenger作为我的Rails服务器。

谢谢。

回答

0

可以在Rails中异步发出多个HTTP请求。但是,使Rails事件驱动是不可能的。

在可以发送多个HTTP请求与库,如Typhoeus异步。但是,如果您的超时时间太长,您可能会遇到并发问题。

否则,您可以尝试一些事件驱动的Web框架,如CrampGoliath。它们都基于EventMachine,因此您可以尝试em-http-request

2

听起来像你应该使用后台作业。在这种情况下,当请求进入时,您可以启动/排队两个作业,这些作业将由工作人员拾取和处理,该工作人员独立于您的Rails应用程序工作。
以下几个环节可能会有所帮助:

https://www.ruby-toolbox.com/categories/Background_Jobs
http://railscasts.com/episodes/171-delayed-job
http://railscasts.com/episodes/243-beanstalkd-and-stalker
http://railscasts.com/episodes/271-resque
http://rubyrogues.com/queues-and-background-processing/

0

尝试使用RabbitMQ的,你可以张贴在队列中的消息,并期望在答复响应队列。队列消费者甚至可以在Scala中实现以保持牢固性。 amqp宝石就足够了我所说的。如果可能的话,使用amqp绑定的Rails控制器会更好(我正在探索具有使用amqp绑定而不是http的端点的选项)。这将解决不足的问题