【问题标题】:delayed_jobs vs resque vs beanstalkd?delay_jobs vs resque vs beanstalkd?
【发布时间】:2011-01-26 18:24:32
【问题描述】:

这是我的需求:

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

【问题讨论】:

    标签: ruby-on-rails redis resque beanstalkd


    【解决方案1】:

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

    Resque vs DelayedJob
    

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

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

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

    在以下情况下选择 Resque:

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

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

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

    如果满足以下条件,请选择 Beanstalkd:

    • 你喜欢数字优先级
    • 您想要极快的队列
    • 您不想浪费内存
    • 您希望提供大量工作
    • 您可以将队列中的 JSONable Ruby 对象用作参数
    • 您需要多个队列

    Resque 绝不是“更好”的 DelayedJob,因此请确保选择最适合您的应用的工具。

    一个不错的comparison of queueing backend speed

                     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
    

    祝你有美好的一天!

    附:有一个关于 resqueDelayed Job (revised version) 和 Beanstakld 的 RailsCast。看看吧!

    附言我现在最喜欢的选择是Sidekiq(对于简单的工作来说非常简单、快速和高效),请查看this page 进行比较。

    【讨论】:

    • 延迟作业现在支持队列..(有一段时间)很好的答案。
    • heroku 是否支持 Beanstakld?
    • 很好的答案。谢谢你:)
    • 过时的答案,DJ 不再处理“任何”ruby 对象,因为 yaml 解析器现在无法导出匿名模块和文件流,因此例如几乎不可能安全地转储 request.env stackoverflow.com/questions/15790124/…
    【解决方案2】:

    Amazon Beanstalk 不是 Beanstalkd。

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

    【讨论】:

    • 这是正确的。 beanstalkd 的 put 操作接受一个 ,它是在作业准备好接收之前的秒数。它还支持优先级。
    【解决方案3】:

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

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

    【讨论】:

    • 这些队列是否并行运行?
    • 是的,你也可以指定每个队列的线程数github.com/collectiveidea/delayed_job
    • 鉴于此,还有什么理由使用resque?只是想把这一切都弄清楚。
    • @baash05 - Resque 仍然有更好的报告,并且不在关系数据库中,因此可以同时处理队列中的更多事情。这仅取决于您想象的混乱程度。在delayed_job 中,三个10,000 的入口队列可以很好地阻塞工作。 resque/redis 中的三个 10,000 入口队列是标准的,易于处理。
    • 我发现使用 Oracle 11g 处理 500K - 700k 左右的作业时,delayed_job 运行良好。我认为除了默认 DJ 生成器创建的内容之外,我们还添加了一两个索引。 Delayed_job_web 是一种跟踪事物的简单方法。
    猜你喜欢
    • 1970-01-01
    • 2012-07-19
    • 2012-09-14
    • 2015-09-14
    • 2012-03-13
    • 2014-08-17
    • 2011-09-18
    • 1970-01-01
    相关资源
    最近更新 更多