我需要一个用于大型动态任务集合的调度程序。目前我正在查看 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 .
最佳答案
- 每当 ( https://github.com/javan/whenever )
- rufus 调度器 ( https://github.com/jmettraux/rufus-scheduler )
- 发条(https://github.com/tomykaira/clockwork)
在某种程度上是纯粹的调度程序。 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/