2011-02-03 83 views
4

我有一個rails 3應用程序,它將某些事件寫入隊列。Ruby對程序事件做出長時間運行的過程

現在在服務器上,我想創建一個服務,每隔x秒輪詢隊列,並按計劃執行其他任務。

除了創建ruby腳本並通過cron作業運行外,還有其他的選擇是否穩定?

回答

5

雖然旋轉起來的持久基於Rails的任務是一種選擇,你可能希望查看更有序的系統,如delayed_jobStarling來管理您的工作量。

我建議不要在cron中運行某些東西,因爲旋轉整個Rails堆棧的開銷可能很大。每隔幾秒運行一次並不實際,因爲Rails上的加速時間通常爲5-15秒,具體取決於您的硬件。但是,一天做幾次這通常不是什麼大問題。

一個簡單的方法是創建一個腳本中的工作循環中,您可以用runner從事:

interval = 15.minutes 
next_time = Time.now + interval 

while (true) 
    if (stuff_to_do?) 
    do_stuff 
    end 

    # Figure out how much time is left before the next iteration 
    delay = next_time.to_i - Time.now.to_i 

    if (delay > 0) 
    # If ahead of schedule, take a break 
    sleep(delay) 
    end 
end 

這樣做的缺點是,Rails的堆棧會在內存中存在,因爲這後臺進程運行,但這是巨大的CPU命中和內存命中之間的折衷。

+0

所以也許在scala中的東西會更有效? – Blankman 2011-02-03 21:09:15

+1

斯卡拉只是另一種語言。在Scala中花費大量時間重新實現您的系統只是爲了在後臺運行它並不會更高效。如果您出於內存原因需要剝離,您可能希望爲僅使用ActiveRecord的後臺作業創建環境,而不使用不會使用的視圖或控制器組件。您可以非常有選擇性地加載模塊,並大大減少內存佔用。 – tadman 2011-02-04 22:46:55

3

你有幾個選擇,包括DelayedJob和Resque

Resque依靠Redis,並且是我一直使用的解決方案(我非常滿意)。

1

@Blankman,你應該檢查出http://www.simpleworker.com,它是由這樣的事情,並採取負擔運行/調度/監控你的流程掉你。它非常穩定。