Ruby长时间运行的进程来响应队列事件

时间:2011-02-03 20:52:34

标签: ruby-on-rails ruby

我有一个rails 3应用程序,可以将某些事件写入队列。

现在,在服务器上,我想创建一个每隔x秒轮询一次队列的服务,并按计划执行其他任务。

除了创建ruby脚本并通过cron作业运行它之外,还有其他稳定的替代方案吗?

5 个答案:

答案 0 :(得分: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命中和内存命中之间的权衡。

答案 1 :(得分:3)

您可以选择多种方式,包括DelayedJob和Resque

Resque依赖于Redis,是我一直使用的解决方案(我非常满意)。

答案 2 :(得分:2)

我会推荐Ryan Bates关于这个主题的轨道广播,讨论beanstalkd和它的潜行者包装:

http://railscasts.com/episodes/243-beanstalkd-and-stalker

答案 3 :(得分:1)

为了增加这里的可能性,使用更加重型的排队系统,如AMQP(RabbitMQ),可以通过'minion'宝石轻松实现。与beanstalkd相似:

https://github.com/orionz/minion

答案 4 :(得分:1)

@Blankman,你应该看看http://www.simpleworker.com,它是为这样的事情做的,并承担了运行/安排/监控你的进程的负担。它非常稳定。