我正在制作一个rails应用程序,我想知道是否可以在控制器层中设置异步/回调架构。我正在尝试执行以下操作:
当向/ my_app / foo发出HTTP请求时,我想异步地将两个工作 - 一个天真的排名工作和一个复杂的排名工作(两个都排名1000个帖子) - 发送到几个工作机器。我想在控制器中为每个作业设置一个回调方法,该作业在相应作业完成时调用。如果复杂的作业在X毫秒内没有返回,我想从原始作业返回输出。否则,我想从复杂的作业返回输出。
重要的是要注意我希望这些作业并行执行。在Rails中实现这样一个系统的最佳方法是什么?我正在使用Apache Phusion Passenger作为我的rails服务器,如果有帮助的话。
感谢。
答案 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框架,例如Cramp和Goliath。它们都基于EventMachine,因此您可以尝试em-http-request。
答案 2 :(得分:0)
尝试使用rabbitmq,您可以在队列中发布消息并期望响应队列中的响应。甚至可以在Scala中实现队列使用者的稳定性。 amqp gem足以满足我的要求。如果可能的话,使用amqp绑定的Rails控制器会更好(我正在探索具有amqp绑定而不是http的端点的选项)。这将解决足够的问题