2009-11-13 127 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任務的優先級。

相關問題