在rails控制器中使用回调进行并行异步处理

时间:2011-11-27 07:55:27

标签: ruby-on-rails asynchronous callback

我正在制作一个rails应用程序,我想知道是否可以在控制器层中设置异步/回调架构。我正在尝试执行以下操作:

当向/ my_app / foo发出HTTP请求时,我想异步地将两个工作 - 一个天真的排名工作和一个复杂的排名工作(两个都排名1000个帖子) - 发送到几个工作机器。我想在控制器中为每个作业设置一个回调方法,该作业在相应作业完成时调用。如果复杂的作业在X毫秒内没有返回,我想从原始作业返回输出。否则,我想从复杂的作业返回输出。

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

感谢。

3 个答案:

答案 0 :(得分: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/

答案 1 :(得分:0)

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

In可以与Typhoeus等库异步发送多个HTTP请求。但是,如果超时太长,则可能会出现并发问题。

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

答案 2 :(得分:0)

尝试使用rabbitmq,您可以在队列中发布消息并期望响应队列中的响应。甚至可以在Scala中实现队列使用者的稳定性。 amqp gem足以满足我的要求。如果可能的话,使用amqp绑定的Rails控制器会更好(我正在探索具有amqp绑定而不是http的端点的选项)。这将解决足够的问题