我有一個rails 3應用程序,它將某些事件寫入隊列。Ruby對程序事件做出長時間運行的過程
現在在服務器上,我想創建一個服務,每隔x秒輪詢隊列,並按計劃執行其他任務。
除了創建ruby腳本並通過cron作業運行外,還有其他的選擇是否穩定?
我有一個rails 3應用程序,它將某些事件寫入隊列。Ruby對程序事件做出長時間運行的過程
現在在服務器上,我想創建一個服務,每隔x秒輪詢隊列,並按計劃執行其他任務。
除了創建ruby腳本並通過cron作業運行外,還有其他的選擇是否穩定?
雖然旋轉起來的持久基於Rails的任務是一種選擇,你可能希望查看更有序的系統,如delayed_job或Starling來管理您的工作量。
我建議不要在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命中和內存命中之間的折衷。
我建議在這個問題上,其談論beanstalkd和死纏爛打包裝它Ryan Bates的railscast:
和asciicasts鏈接(可搜索):http://asciicasts.com/episodes/243-beanstalkd-and-stalker – 2011-02-03 20:58:12
你有幾個選擇,包括DelayedJob和Resque。
Resque依靠Redis,並且是我一直使用的解決方案(我非常滿意)。
爲了增加這裏的可能性,'minion'寶石使得像AMQP(RabbitMQ)這樣更加強大的排隊系統變得容易。類似beanstalkd:
@Blankman,你應該檢查出http://www.simpleworker.com,它是由這樣的事情,並採取負擔運行/調度/監控你的流程掉你。它非常穩定。
所以也許在scala中的東西會更有效? – Blankman 2011-02-03 21:09:15
斯卡拉只是另一種語言。在Scala中花費大量時間重新實現您的系統只是爲了在後臺運行它並不會更高效。如果您出於內存原因需要剝離,您可能希望爲僅使用ActiveRecord的後臺作業創建環境,而不使用不會使用的視圖或控制器組件。您可以非常有選擇性地加載模塊,並大大減少內存佔用。 – tadman 2011-02-04 22:46:55