2011-02-03 86 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,它是由这样的事情,并采取负担运行/调度/监控你的流程掉你。它非常稳定。