我需要一个用于大型动态任务集合的调度程序。目前我正在研究resque-scheduler、rufus-scheduler和Clockwork。我将不胜感激有关选择使用哪一个(或什么替代方案)的建议。
一些细节:
- 有大量任务(最多 100K)需要定期执行。
- 最短的执行周期为1h。
- 新任务可能会不时出现。现有任务可能会被更改或删除。
- 调度延迟最小化在这里不是关键任务(可扩展性和可持续性是最重要的)。
- 任务执行不是一个繁重的操作,并且可以很容易地并行。
总而言之,我需要像 cron 这样的 Ruby 项目,它可以处理大量动态变化的任务集合。
更新:我花了一天时间尝试调度库,现在我想简要总结一下新获得的经验。
我已经不再关注 Clockwork 和 resque-scheduler 库,因为它们是更成熟的项目,具有更详细的文档。Resque-scheduler 基于 rufus-scheduler 而 Clockwork 受其启发,两者都可用于我正在寻找的解决方案。
两者都是独立的服务,应该在单独的进程中运行,可以处理几乎无限量的计划为单次或重复执行的任务。任务在线程内执行。
发条优点:
- 它能够从数据库(通过 ActiveRecord 或任何任意来源)加载计划任务。
- 它还可以通过轮询数据库中的数据更新来动态更新计划任务。
发条的缺点:
- 数据库轮询是一个潜在的瓶颈。
- 轮询间隔为 1 分钟(加上重新调度所有任务的时间),这有点太慢了。
- 计划任务寻址(取消计划或更改)是未记录的,这就是为什么使用此功能对我来说似乎是一种黑客行为。
我已经为 Clockwork 实现了一个替代的 Manager 类(这是控制调度的 gem 的核心部分),以允许通过 ZeroMQ 消息进行调度控制。所以我项目中的主要服务可以向调度器发送命令,比如“每天运行这个”,或者“取消调度任务#10”,调度器会立即执行每个请求。
我对 resque-scheduler 的经验较少,但在这一点上,它看起来是一个更好的解决方案。
resque-scheduler 优点:
- 基于 Redis 的持久性。该手册声称可以在服务重新启动后挽救计划任务。
- 使用干净的 API 进行动态调度。您只需调用
Resque.remove_schedule(name)
以删除特定任务。 - 网页界面。不太重要,但很高兴拥有。
resque调度程序:
- 它需要安装 Redis。
可能会出现别的东西,仔细看后,但此刻没有别的东西。
这就是我现在所拥有的。顺便说一句,我在 GitHub 上发布了许多与调度相关的 Ruby gem 的链接。