我需要一个用于大型动态任务收集的调度程序。目前,我正在查看resque-schedulerrufus-schedulerclockwork。对于选择使用哪种(或哪种替代)的建议,我将不胜感激。

一些细节:

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

  • 总结,我需要像cron这样的用于Ruby项目的东西,它可以处理大型的,动态变化的任务集合。

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

    我停止了对Clockwork和resque-scheduler库的关注,因为它们是更成熟的项目,具有更详细的文档。 Resque-scheduler基于rufus-scheduler,而Clockwork则受其启发,两者均可用于我正在寻找的解决方案。

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

    发条专家:
  • 它具有从数据库(通过ActiveRecord或任何任意源)加载计划任务的能力。
  • 它还可以通过轮询数据库中的数据更新来动态更新计划的任务。

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

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

    我对resque-scheduler的经验较少,但是目前看来,这是一个更好的解决方案。

    resque-scheduler的优点:
  • 基于Redis的持久性。该手册断言,服务重启后可以恢复计划的任务。
  • 使用干净的API进行动态调度。您只需调用Resque.remove_schedule(name)即可删除特定任务。
  • Web UI。不太重要,但是很高兴。

  • resque-scheduler:
  • 它需要安装Redis。

  • 仔细观察后可能会出现其他现象,但此刻什么也没有。

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

    最佳答案

  • 每当(https://github.com/javan/whenever)
  • rufus-scheduler(https://github.com/jmettraux/rufus-scheduler)
  • 发条(https://github.com/tomykaira/clockwork)

  • 是纯调度程序。每当有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,Clockwork等),也许您可​​以在它们之上进行构建。

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

    10-13 04:20