用Ruby进行大规模调度

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

嘿,有没有类似于Resque.list_all_schedule的东西? - Pandya M. Nandan
1个回答

4

这些都是纯调度程序。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等),也许可以在它们之上构建。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接