64

这是我的需求:

  • 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 ) 是您应该检查的另一个选项。

4

3 回答 3

137

对于我的项目,我会对 rails2 和 3 中的collectiveidea/delayed_job感到非常舒服。我不知道beantalkd,但我会尽快尝试:-)。我已遵循 resque 文档中的建议。我会报告的。

Resque vs DelayedJob

Resque 与 DelayedJob 相比如何,您为什么会选择其中一个?

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

如果你在做 Rails 开发,你已经有一个数据库和 ActiveRecord。DelayedJob 非常容易设置并且效果很好。GitHub 使用它数月来处理近 2 亿个工作。

在以下情况下选择 Resque:

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

如果出现以下情况,请选择 DelayedJob:

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

在以下情况下选择 Beanstalkd:

  • 你喜欢数字优先级
  • 你想要极快的队列
  • 你不想浪费你的内存
  • 你想服务大量的工作
  • 您可以将队列上的 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

祝你今天过得愉快!

PS 有一个关于resqueDelayed Job修订版)和Beanstakld 的RailsCast。看一看!

PPS 我现在最喜欢的选择是Sidekiq(非常简单、快速、高效,适用于简单的工作),请查看此页面进行比较。

于 2011-01-26T22:22:11.477 回答
9

Amazon Beanstalk 不是 Beanstalkd。

Beanstalkd - 队列 - 确实有延迟的作业,在给定的秒数过去之前不会被保留在队列之外。如果那是什么Enqueue_in(10.hours, ... )意思,那么计算秒数只是语法糖,直到那时才提供工作。

于 2011-01-26T22:25:42.423 回答
8

只是一个小提示:delayed_job 3.0+支持命名队列

object.delay(:queue => 'tracking').method    
Delayed::Job.enqueue job, :queue => 'tracking'    
handle_asynchronously :tweet_later, :queue => 'tweets'
于 2012-01-26T13:15:57.133 回答