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

Ruby on rails 响应队列事件的Ruby长时间运行进程,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有一个rails 3应用程序,可以将某些事件写入队列 现在,我想在服务器上创建一个服务,该服务每x秒轮询一次队列,并按计划执行其他任务 除了创建一个ruby脚本并通过cron作业运行它之外,还有其他稳定的替代方案吗?我建议Ryan Bates在这个主题上介绍beanstalkd和跟踪者包装器: 尽管旋转一个基于Rails的持久性任务是一种选择,但您可能希望查看更有序的系统,如or,以管理您的工作负载 我建议不要在cron中运行某些东西,因为旋转整个Rails堆栈的开销可能会很大。每隔几秒钟运行

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

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


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

我建议Ryan Bates在这个主题上介绍beanstalkd和跟踪者包装器:


尽管旋转一个基于Rails的持久性任务是一种选择,但您可能希望查看更有序的系统,如or,以管理您的工作负载

我建议不要在
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命中和内存命中之间的折衷

您有几种选择,包括延迟作业和


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

为了增加这里的可能性,像AMQP(RabbitMQ)这样的更重型排队系统的使用由“仆从”gem简化。与豆茎类似:


@Blankman,你应该检查一下,它是为这样的事情而设计的,它可以减轻你运行/安排/监控流程的负担。而且它非常稳定。

还有AsciCasts链接(可搜索):所以scala中的某些东西可能更有效?scala只是另一种语言。花大量时间在Scala中重新实现您的系统,而只是在后台运行它,效率不会更高。如果出于内存原因需要剥离,您可能希望为后台作业创建一个只使用ActiveRecord的环境,而不使用不使用的视图或控制器组件。您可以非常有选择性地选择加载哪些模块,并大幅削减内存占用。以我的经验,DelayedJob和Resque(使用Redis To Go)在Heroku上都能很好地工作。@Steve DelayedJob与Heroku的MongoHQ产品不配合。将迅速导致您的MongoHQ DB锁定。不要认为它适用于这里,但作为一个提示。@Chris在Heroku上使用了RDS的DelayedJob,它工作得相当好。