ruby - Ruby 中的大规模调度

标签 ruby cron scheduling resque rufus-scheduler

我需要一个用于大型动态任务集合的调度程序。目前我正在查看 resque-scheduler , rufus-scheduler , 和 clockwork .如果您提供有关选择使用哪一个(或其他替代方案)的建议,我将不胜感激。

一些细节:

  • 有大量要定期执行的任务(最多 100K)。
  • 最短执行周期为1h。
  • 新任务可能会不时出现。现有任务可能会更改或删除。
  • 调度延迟最小化在这里不是关键任务(可扩展性和可持续性最重要)。
  • 任务执行不是繁重的操作,可以轻松并行。

总结,我需要类似 cron 的 Ruby 项目,它可以处理大量动态变化的任务集合。

更新:我花了一天时间尝试调度库,现在我想简单总结一下新获得的经验。

我已经不再关注 Clockwork 和 resque-scheduler 库,因为这些是具有更详细文档的更成熟的项目。 Resque-scheduler 基于 rufus-scheduler 而 Clockwork 的灵感来自于它,两者都可以用于我正在寻找的解决方案。

两者都是独立的服务,应该在单独的进程中运行,可以处理几乎无限量的计划单次或循环执行的任务。任务在线程内执行。

发条专业人士:

  • 它能够从数据库加载计划任务(通过 ActiveRecord 或任何任意来源)。
  • 它还可以通过轮询数据库中的数据更新来动态更新计划任务。

发条缺点:

  • 数据库轮询是这里的一个潜在瓶颈。
  • 轮询间隔为 1 分钟(加上重新安排所有任务的时间),这有点太慢了。
  • 计划任务寻址(取消计划或更改)未记录在案,这就是为什么使用此功能对我来说就像黑客攻击。

我已经为 Clockwork(这是控制调度的 gem 的核心部分)实现了一个替代的管理器类,以允许通过 ZeroMQ 消息进行调度控制。因此,我项目中的主要服务可以向调度程序发送命令,例如“每天运行一次”或“取消安排任务 #10”,调度程序会立即执行每个请求。

我对 resque-scheduler 的经验较少,但在这一点上它看起来是一个更好的解决方案。

resque-scheduler 优点:

  • 基于 Redis 的持久性。手册断言,服务重启后可以挽救计划任务。
  • 使用干净的 API 进行动态调度。您只需调用 Resque.remove_schedule(name) 即可删除特定任务。
  • 网络用户界面。不太重要,但很高兴拥有。

resque-调度器:

  • 需要安装Redis。

仔细观察后可能会出现其他东西,但目前没有其他东西。

这就是我现在所拥有的。顺便说一句,我已经发布了一些指向与调度相关的 Ruby gems 的链接 on GitHub .

最佳答案

在某种程度上是纯粹的调度程序。 Whenever 由 Crond 支持,所以它是可靠的(但作业将在不同的进程中执行)。 Rufus-scheduler 和 Clockwork 类似,在 Ruby 进程中,调度器(Clockwork 的灵感来自于 rufus-scheduler)。

Resque-scheduler ( https://github.com/resque/resque-scheduler ) 建立在 Resque(任务管理)和 rufus-scheduler(日程管理)之上。

您也应该看看 Sidekiq ( http://sidekiq.org/ )。看https://www.google.com/?q=sidekiq%20scheduler#q=sidekiq+scheduler

因此了解 Resque 和 Sidekiq,然后查看它们可用的调度程序。如果没有适合您的东西,请查看调度程序(Whenever、rufus-scheduler、Clockwork 等)本身,也许您可​​以在它们之上构建。

关于ruby - Ruby 中的大规模调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24745809/

相关文章:

ruby - 使用 class_eval 和 instance_eval 访问 Ruby 类变量

arrays - 我想使用logstash输入elasticsearch结果创建一个新数组

php - Cron 作业,在 Codeigniter 中查询的调度和线程

ruby-on-rails - 使用 Ruby on Rails 安排发送电子邮件任务的最佳方法是什么?

ruby-on-rails - Ruby 和 Rails 性能问题,服务器

ruby - 使用 Ruby 正则表达式处理空格的问题

linux - 运行 cron sh 时出错

linux - 调用 cron 作业时获取用户名

c - 线程调度和让出

java - 如何使用 Java Timer 和 TimerTask 安排具有开始时间和结束时间的任务