delayed_jobs vs resque vs beanstalkd?

raf*_*mvc 64 ruby-on-rails beanstalkd resque redis

这是我的需求:

  • Enqueue_in(10.hours,...)(DJ语法很完美.)
  • 兼职工人.(Resque或beanstalkd对此有好处,但不是DJ)
  • 必须每秒处理100个作业的推送和弹出.(我需要进行测试以确保,但我认为DJ无法处理这么多工作)

Resque和beanstalkd不执行enqueue_in.

有一个插件(resque_scheduler)可以做到这一点,但我不确定它是多么稳定.

我们的环境是关于亚马逊的,他们为亚马逊实例免费推出了beanstalkd,这对我们来说是一个加分,但我仍然不确定这里最好的选择是什么.

我们运行rails 2.3但是我们很快就将其加速到rails 3.0.3.

但这里我最好的选择是什么?我错过了另一个更好地完成这项工作的宝石吗?

我觉得我现在唯一可行的选择是resque_scheduler.

编辑:

Sidekiq(https://github.com/mperham/sidekiq)是另一个你应该检查的选项.

and*_*rea 137

对于我的项目,我会对rails2和3中的collectiveidea/delayed_job感到非常舒服.我不知道beanstalkd,但我会尽快尝试:-).我已经按照resque文档中的建议进行了操作.我会举报.

Resque vs DelayedJob
Run Code Online (Sandbox Code Playgroud)

Resque如何与DelayedJob相比,为什么你会选择一个而不是另一个呢?

  • Resque支持多个队列
  • DelayedJob支持更精细的优先级
  • Resque worker可以抵御内存泄漏/膨胀
  • DelayedJob工作人员非常简单,易于修改
  • Resque需要Redis
  • DelayedJob需要ActiveRecord
  • Resque只能将JSONable Ruby对象作为参数放在队列中
  • DelayedJob可以将任何Ruby对象作为参数放在其队列中
  • Resque包含一个Sinatra应用程序,用于监控正在发生的事情
  • 如果要添加接口,可以在Rails应用程序中查询DelayedJob

如果您正在进行Rails开发,那么您已经拥有了一个数据库和ActiveRecord.DelayedJob非常容易设置,效果很好.GitHub使用它持续了好几个月来处理近2亿个工作岗位.

选择Resque if:

  • 你需要多个队列
  • 你不关心/不喜欢数字优先级
  • 您不需要持久保存每个Ruby对象
  • 你有很大的队列
  • 你想看看发生了什么
  • 你期待很多失败/混乱
  • 您可以设置Redis
  • 你没有在RAM上做空

选择DelayedJob如果:

  • 你喜欢数字优先级
  • 你每天都没有做大量的工作
  • 你的队列保持小巧灵活
  • 没有太多的失败/混乱
  • 你想轻松地在队列上扔任何东西
  • 您不想设置Redis

选择Beanstalkd如果:

  • 你喜欢数字优先级
  • 你想要非常快的队列
  • 你不想浪费你的RAM
  • 你想要提供大量的工作
  • 你可以将队列中的JSONable Ruby对象作为参数使用
  • 你需要多个队列

Resque绝不是一个"更好"的DelayedJob,因此请确保选择最适合您应用的工具.

排队后端速度的一个很好的比较:

                 enqueue                work
-------------------------------------------------
delayed job |   200 jobs/sec     120 jobs/sec
resque      |  3800 jobs/sec     300 jobs/sec
rabbitmq    |  2500 jobs/sec    1300 jobs/sec
beanstalk   |  9000 jobs/sec    5200 jobs/sec
Run Code Online (Sandbox Code Playgroud)

祝你今天愉快!

PS有关于resque,Delayed Job(修订版)和Beanstakld的RailsCast.看一看!

PPS我最喜欢的选择是现在的Sidekiq(非常简单,快速和高效的简单工作),看看这个页面进行比较.

  • 延迟工作现在支持队列..(一段时间)虽然很好的答案. (2认同)

Ali*_*man 8

Amazon Beanstalk不是Beanstalkd.

Beanstalkd - 队列 - 确实有延迟的作业,在给定的秒数过去之前不会保留在队列之外.如果这Enqueue_in(10.hours, ... )意味着什么,那么计算秒数只是语法糖,而在此之前不能提供工作.

  • 这是对的.beanstalkd的put操作接受<delay>,这是作业准备好接收之前的秒数.它还支持优先事项. (3认同)

alt*_*ure 8

只是一个小注释:delayed_job 3.0+支持命名队列

object.delay(:queue => 'tracking').method    
Delayed::Job.enqueue job, :queue => 'tracking'    
handle_asynchronously :tweet_later, :queue => 'tweets'
Run Code Online (Sandbox Code Playgroud)

  • @ baash05 - Resque仍然有更好的报告,并且不在关系数据库中,因此可以一次处理队列中的更多内容.这取决于你想象的混乱程度.三个10,000个入口队列可以在delayed_job中很好地阻塞这些工作.resque/redis中的三个10,000个入口队列是标准的,易于处理. (2认同)