我有一个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