如何将控制器方法作为后台任务运行?

时间:2009-11-13 17:28:23

标签: ruby-on-rails ruby background scheduled-tasks

我听说过各种后台任务工具(delayed_job,starling,workling等),但从查看它们看起来它们实际上只能运行基于模型的方法(例如User.update_counters)。

我需要能够运行一个控制器方法,因为它是一组非常复杂的任务,它们交织了大量其他控制器方法和自定义类。

这是一个CPU密集型过程,运行大约需要5-10分钟,因此我希望它能够在不干扰其他用户的“正常”站点操作的情况下运行。

我误解了其他工具是如何工作的吗?或者还有其他我不考虑的事情吗?

4 个答案:

答案 0 :(得分:2)

可接受的处理方式是将所有复杂逻辑移入模型,并让控制器仅指导请求和响应。这就是“胖模型和瘦调控制​​器”理论所说的。将复杂逻辑移动到模型类(不一定是ActiveRecord类),也可以让后台工具调用rake任务。

答案 1 :(得分:1)

如果你真的需要运行控制器动作,那么你可以使用cron和wget或curl。但是我建议将复杂的逻辑移到模型或库中,这样你就可以使用你提到的一个后台工具在控制器之外调用它。

答案 2 :(得分:1)

您可能需要考虑将此复杂任务转变为rake任务。您的rake任务仍然可以引用您的模型,因此建议您尽可能多地推送与其相关的逻辑。

此外,由于您说任务受CPU限制并且在执行时网站速度变慢,因此可以使用nice(假设您在UNIX系统上)调整rake任务的优先级。

答案 3 :(得分:0)

在这种情况下,我会说你的过程最好不在控制器领域之外。如果你有这个大型进程在整个系统运行时陷入困境,那么我的第一个响应是假设我的进程不像它需要的那样光滑。如果这个过程确实是如此密集以至于使整个系统陷入困境,那么它就是夜间过程或停机期间的主要候选者。