Ruby中的大规模调度

时间:2014-07-14 20:54:14

标签: ruby cron scheduling resque rufus-scheduler

我需要一个用于大型动态任务集合的调度程序。目前,我正在查看resque-schedulerrufus-schedulerclockwork。我将非常感谢您选择使用哪一种(或替代品)。

一些细节:

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

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

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

我已经停止了对Clockwork和resque-scheduler库的注意,因为这些是更成熟的项目,有更详细的文档。 Resque-scheduler基于rufus-scheduler,而Clockwork受其启发,两者都可以用于我正在寻找的解决方案。

两者都是应该在单独进程中运行的独立服务,可以处理为单个或经常执行而安排的几乎无限量的任务。任务在线程中执行。

发条专业人士:

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

发条缺点:

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

我已经为Clockwork实现了另一个Manager类(这是控制调度的gem的核心部分),以允许通过ZeroMQ消息进行调度控制。因此,我的项目中的主要服务可以向调度程序发送命令,例如"每天运行此操作"或者"取消调度任务#10",并且调度程序立即执行每个请求。

我对resque-scheduler的经验较少,但此时它似乎是一个更好的解决方案。

resque-scheduler pros:

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

resque调度器:

  • 需要安装Redis。

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

这就是我现在所拥有的。顺便说一句,我已经发布了许多与调度相关的Ruby宝石on GitHub的链接。

1 个答案:

答案 0 :(得分:4)

是某种纯粹的调度程序。无论何时由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,然后查看可用的调度程序。如果没有什么比你更合适的话,请看一下调度程序(每当,rufus-scheduler,发条,...),也许你可以在它们之上构建。