我有一个rails 3应用程序,可以将某些事件写入队列。
现在,在服务器上,我想创建一个每隔x秒轮询一次队列的服务,并按计划执行其他任务。
除了创建ruby脚本并通过cron作业运行它之外,还有其他稳定的替代方案吗?
答案 0 :(得分:5)
虽然可以选择启用基于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命中和内存命中之间的权衡。
答案 1 :(得分:3)
您可以选择多种方式,包括DelayedJob和Resque。
Resque依赖于Redis,是我一直使用的解决方案(我非常满意)。
答案 2 :(得分:2)
我会推荐Ryan Bates关于这个主题的轨道广播,讨论beanstalkd和它的潜行者包装:
答案 3 :(得分:1)
为了增加这里的可能性,使用更加重型的排队系统,如AMQP(RabbitMQ),可以通过'minion'宝石轻松实现。与beanstalkd相似:
答案 4 :(得分:1)
@Blankman,你应该看看http://www.simpleworker.com,它是为这样的事情做的,并承担了运行/安排/监控你的进程的负担。它非常稳定。