delayed_jobs vs resque vs beanstalkd?

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。

但在这里,我的最佳选择是什么?我是否漏掉了另一个更好的 gem?

我感觉目前唯一可用的选项是 resque_scheduler。

编辑:

Sidekiq (https://github.com/mperham/sidekiq) 是另一个你应该考虑的选择。

3个回答

136

对于我的项目,我会在rails2和3中使用 collectiveidea/delayed_job,感觉非常舒适。 我不了解beanstalkd,但我很快会尝试它 :-) 我已经按照resque文档中的建议进行操作。 我会报告结果。

Resque vs DelayedJob

Resque和DelayedJob有什么区别,你会选择其中一个吗?

  • Resque支持多个队列。
  • DelayedJob支持更精细的优先级。
  • Resque工作进程对内存泄漏/膨胀具有韧性。
  • DelayedJob工作进程非常简单且易于修改。
  • Resque需要Redis。
  • DelayedJob需要ActiveRecord。
  • Resque只能将可JSON化的Ruby对象作为参数放置在队列上。
  • DelayedJob可以在其队列中放置任何Ruby对象作为参数。
  • Resque包括一个Sinatra应用程序,用于监视正在进行的操作。
  • 如果要添加接口,可以从Rails应用程序中查询DelayedJob。

如果你正在进行Rails开发,你已经拥有一个数据库和ActiveRecord。DelayedJob非常易于设置并且运行良好。GitHub使用它处理了近2亿个作业。

如果:

  • 你需要多个队列
  • 你不关心或不喜欢数字优先级
  • 你不需要永久存储每个Ruby对象
  • 你有潜在的巨大队列
  • 你希望知道正在发生什么
  • 你期望有很多失败或混乱
  • 你可以设置Redis
  • 你的内存不足

选择Resque。

如果:

  • 你喜欢数字优先级
  • 每天不需要处理大量作业
  • 你的队列小而灵活
  • 没有太多失败/混乱
  • 你希望轻松地将任何东西放在队列中
  • 你不想设置Redis

选择DelayedJob。

如果:

  • 你喜欢数字优先级
  • 你需要极快的队列
  • 你不想浪费RAM
  • 你希望处理大量作业
  • 你可以接受将可JSON化的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

祝您有美好的一天!

P.S. 有一个有关 resqueDelayed Job修订版)和 Beanstakld 的 RailsCast。看一下吧!

P.P.S. 我现在最喜欢的选择是 Sidekiq(非常简单、快速和高效的简单作业),请查看此页面进行比较。


2
延迟作业现在支持队列了(有一段时间了)。虽然很棒的答案。 - baash05
1
Heroku支持Beanstalkd吗? - Amit Patel
1
过时的答案,DJ不再处理“任何”Ruby对象,因为yaml解析器现在无法导出匿名模块和文件流,所以例如几乎不可能安全地转储request.env。https://dev59.com/6XDYa4cB1Zd3GeqPAniJ - bbozo

9

Amazon Beanstalk不是Beanstalkd。

Beanstalkd - 队列 - 确实有延迟任务,直到给定秒数过去后才会从队列中保留。如果这就是Enqueue_in(10.hours, ... )的意思,那么它只是计算秒数的语法糖,并且在那时之前不会使作业可用。


3
没问题。beanstalkd的put操作接受一个<delay>参数,表示作业变为可接收状态所需等待的秒数。它还支持优先级。 - James Cooper

8

小提示:仅延迟任务 3.0+支持命名队列。

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

这些队列是否并行运行? - slotishtype
是的,您还可以指定每个队列的线程数 https://github.com/collectiveidea/delayed_job - altuure
考虑到这一点,使用 Resque 的原因是什么?只是尝试理清所有内容。 - baash05
2
@baash05 - Resque仍然具有更好的报告功能,并且不在关系型数据库中,因此可以一次处理更多的队列事项。这只取决于您想象中有多少混乱。在delayed_job中,三个10,000条目队列可能会使工作出现问题。在resque/redis中,三个10,000条目队列是标准且易于处理的。 - Christopher WJ Rueber
我发现使用 Oracle 11g,delayed_job 在大约 500K - 700k 个任务时运行良好。我认为除了默认 DJ 生成器创建的索引外,我们还添加了一两个索引。Delayed_job_web 是跟踪这些任务的简单方法。 - sockmonk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接