后台任务在rails中立即并行执行

时间:2012-12-20 22:33:50

标签: ruby-on-rails rake fork passenger delayed-job

我们的rails web应用程序必须下载/解压缩来自ftp的html页面的档案,以便用户通过浏览器查看。

存档可能非常大,因此用户必须等到它在服务器上下载/解压缩。

我实现了进度条,就像我在用户的请求中调用fork / Process.detach一样,以便他的请求完成,但下载/解包过程继续在后台运行。并且在他的浏览器中呈现的javascript将我们的服务器ping到状态,直到所有状态都准备就绪,然后将其重定向到解压缩的html页面。

只要用户请求一个存档,一切顺利,但如果他试图同时运行2个或更多请求(以便启动更多的分支),似乎只有其中一个完成,其余的到期/超时/被乘客(?)杀死。我想它是Passenger / forking的问题。

我不确定是否有可能以某种方式修复它所以我想我需要切换到另一种解决方案。该解决方案需要允许立即和并行处理下载。因此,如果用户请求多个档案,他必须同时在所有档案中看到下载/解压缩进度。

我正在考虑立即运行后台rake作业,但启动时似乎很慢(同时在我们的服务器上每分钟都会发生很多cron rake任务)。我喜欢fork的原因是它开始非常快。我知道工作有延迟,我们也会大量用于其他任务。但它可以在没有队列的情况下立即同时启动多个进程吗?

2 个答案:

答案 0 :(得分:1)

通过保持fork并使用单个dj worker来解决。通过这种方式,我可以根据需要同时启动多个流程而不会对乘客造成麻烦/修改我们产品的宝石集(我们试图避免这种情况,因为它导致了过去的错误)

不确定在dj工作人员中分叉是否会造成任何麻烦,所以请问 running fork in delayed job

如果id可以自由修改gemset,id可能会使用resque作为wrdevos建议,或者sidekiq,或者girl_friday(但这可能性较小,因为它取决于服务器的运行)。

答案 1 :(得分:0)

使用Resque:https://github.com/defunkt/resque

有关bg职位和Resque的更多信息。

https://github.com/blog/542-introducing-resque