2009-11-13 131 views
0

我听说过各种后台任务工具(delayed_job,starling,workling等),但是看起来他们真的只能运行基于模型的方法(例如User.update_counters)。如何将控制器方法作为后台任务运行?

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

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

我误解了其他工具的工作原理吗?还是有什么我不考虑?

回答

2

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

1

如果您确实需要运行控制器操作,那么您可以使用cron和wget或curl。但是,我建议将复杂逻辑移出模型或库,然后使用您提到的后台工具之一将其称为控制器外部。

+0

我实际上已经在做w/wget的cron设置,但是现在当它运行时,它已经陷入了整个网站,因为它非常密集。 – Shpigford 2009-11-13 17:39:35

0

我想说你的过程最好在这种情况下留在控制器之外。如果你有这个让整个系统在运行时陷入困境的大型流程,那么我的第一个反应就是假设我的流程并不像它需要的那样流畅。如果这个过程确实如此密集,以至于让整个系统陷入困境,那么它就是夜间过程或停机时间的主要候选对象。

1

你可能想考虑把这个复杂的任务变成一个耙子任务。你的耙子任务仍然可以引用你的模型,所以建议你尽量多地推入与它们相关的逻辑。

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

相关问题