【发布时间】:2014-09-27 00:16:45
【问题描述】:
假设您正在构建类似于监控服务的东西,它有数千个任务需要在给定的时间间隔内执行,彼此独立。这可能是需要检查的单个服务器,或者需要验证的备份,或者只是可以安排在给定时间间隔运行的任何东西。
您不能只通过 cron 来安排任务,因为当任务运行时,它需要确定下一次应该何时运行。例如:
- 每 1 分钟安排一次服务器正常运行时间检查
- 第一次检查服务器已关闭,安排下一次检查在 5 秒后
- 5 秒后服务器再次可用,5 秒后再次检查
- 5 秒后服务器仍然可用,以 1 分钟间隔继续检查
想到的一个简单的解决方案是简单地让一个 worker 每秒运行一次左右,检查所有挂起的作业并执行需要执行的作业。但是,如果工作的数量是 100 000,这将如何运作?检查它们可能需要更长的时间,而不是工人的滴答间隔,并且任务越多,轮询间隔就越高。
有没有更好的方法来设计这样的系统?在实现这一点或处理此类问题的任何算法方面是否存在任何隐藏的挑战?
【问题讨论】:
-
我猜你应该调用低级操作系统函数来安排任务;他们可能最有效地在正确的时间调用它们。例如。 unixhelp.ed.ac.uk/CGI/man-cgi?at。除此之外,我可能会涉及队列和工作人员来管理可伸缩性。
-
处理 100000 个项目列表的时间不太可能超过 1 秒。您需要接近 10000000 的东西才能成为问题。此外,一旦您完成超过 86400 个任务,只需列出 86400 秒(一天中的秒数)并将您的任务附加到它们需要运行的秒数,效率会更高。
-
@slebetman:如果给定任务的下一次运行时间是明天的某个时间——或者第二天,或者从现在起一周后,这将如何工作?您是否会每天为下一年分配一个包含 86400 个项目的数组,只是为了安排每年恰好发生一次的“审计文件 xxx”?
-
@JerryCoffin:没有提到运行时间会超过 24 小时。事实上,我最初阅读的规范允许您实现 1 小时的最大时间分辨率,这意味着您可能只使用 60 个插槽。
-
@slebetman:1 小时将是 3600 个插槽(不会有任何巨大差异)。
标签: algorithm language-agnostic cron queue scheduled-tasks