Rails App在后台运行长任务的最佳实践?

JP *_*son 32 ruby ruby-on-rails

我有一个Rails应用程序,不幸的是在向控制器发出请求之后,需要做一些需要一段时间的运算.Rails中为长期运行的任务或请求提供反馈或进度的最佳做法是什么?这些控制器方法通常持续60秒以上.

我不关心客户端......我计划每隔一秒左右发出一次Ajax请求并显示进度指示器.我只是不确定Rails最佳实践,我是否创建了一个额外的控制器?我能做些什么聪明的事吗?我希望只使用Rails专注于服务器端的答案.

在此先感谢您的帮助.

编辑:

如果重要,http请求适用于PDF.然后我将Rails与Ruport一起生成这些PDF.问题是,这些PDF非常大并且包含大量数据.使用后台任务仍然有意义吗?假设平均PDF需要大约一分钟到两分钟,这会使我的Rails应用程序在此期间对任何其他服务器请求没有响应吗?

编辑2:

好的,经过进一步调查后,似乎我的Rails应用程序确实没有响应任何其他HTTP请求后请求大型PDF. 所以,我想现在的问题是:什么是最好的线程/后台机制? 它必须稳定并保持稳定.我很惊讶Rails没有内置的东西.

编辑3:

我已阅读此页:http://wiki.rubyonrails.org/rails/pages/HowToRunBackgroundJobsInRails.我很想阅读有关这些工具的各种经验.

编辑4:

如果重要的话,我正在使用Passenger Phusion"modrails".

编辑5:

我正在使用Windows Vista 64位开发机器; 但是,我的生产机器是Ubuntu 8.04 LTS.我应该考虑为我的开发机器切换到Linux吗?解决方案是否适用于两者?

小智 24

Workling插件允许您安排在队列中后台任务(它们将执行冗长的任务).从版本0.3开始,您可以向工作人员询问其状态,这将允许您显示一些漂亮的进度条.

Workling的另一个很酷的功能是可以切换异步后端:你可以使用DelayedJobs,Spawn(经典前叉),Starling ......

  • 如果你想避免使用Rails中的宝石,你将会遇到困难......无论如何,修补宝石可能比从头开始构建每个组件要容易得多. (2认同)

Sar*_*Mei 6

我有一个非常大的卷网站,生成大量的大型CSV文件.这些有时需要几分钟才能完成.我做以下事情:

  • 我有一个作业表,其中包含所请求文件的详细信息.当用户请求文件时,请求进入该表,并且用户被带到列出其所有作业的"作业状态"页面.
  • 我有一个rake任务,它运行所有未完成的工作(Job模型上的类方法).
  • 我在另一个处理这些工作的盒子上单独安装了rails.这个盒子只是做工作,外面的世界无法访问.
  • 在这个单独的框中,cron作业每60秒运行所有未完成的作业,除非作业仍在上次调用中运行.
  • 用户的作业状态页面会自动刷新以显示作业的状态(在作业启动,运行,然后完成时由作业框更新).作业完成后,结果文件中会显示一个链接.

如果你打算一次只运行一两个,但是如果你想扩展...... :)这可能太重了