6

我需要一个用于大型动态任务集合的调度程序。目前我正在研究resque-schedulerrufus-schedulerClockwork。我将不胜感激有关选择使用哪一个(或什么替代方案)的建议。

一些细节:

  • 有大量任务(最多 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 的链接。

4

1 回答 1

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,然后查看它们可用的调度程序。如果没有适合您的东西,请查看调度程序(Whenever,rufus-scheduler,Clockwork,...)本身,也许您可​​以在它们之上构建。

于 2014-07-14T21:50:26.493 回答