我们在无限循环中编写了一个计划作业,睡眠时间为 120 秒。计划任务是在网站上 ping 以获取少量数据。与我们的解决方案相比,使用 cron 作业有哪些优点/缺点?
3 回答
构建一个轮询远程站点的程序提供了这些问题/好处,
- 一个缺陷(未处理的异常)和程序可能会失败,并停止轮询
- 程序中的延迟可能会导致时间滑动(>120 秒延迟)
- 关注点分离 - 轮询的调度与程序逻辑混合使得更多代码(以及更多失败的机会)
- DRY - 为什么(重新)构建已经存在的 cron 功能
- 即使不使用程序也必须位于内存中(1/120s)
Cron 是为定期调度而构建的,这里有一些问题/好处,
- Cron 已经构建,并且可以运行,非常可靠
- 提供环境和日志输出需要小心
- 子程序必须每 120 秒重新启动一次
- Cron 不检查其他程序/服务器/依赖项
- Cron 不发出信号/启动下游依赖项
- Cron 不提供严格的调度约束(既不是亚秒级,也不是近实时)
工作优势cron
:
- 您更容易控制它何时运行。您可以控制它将执行的分钟、小时、天等
- 编写代码和管理其操作更容易。它消除了任务中的循环和定时逻辑,您可以运行
crontab
以更改定时或将其关闭。 - 它不运行时不会占用系统中的内存。
- 如果由于某种原因失败并退出,它将在适当的时候重新启动
无限循环的优点:
- 它没有每次需要时都重新启动的开销
我认为在这种特定情况下,关于 CPU 实时和内存的优缺点可能很小。但我更喜欢cron
任何可以无限期运行的工作,因为它可以控制它的执行时间和易于管理。
除了上面的答案,还有一个警告。您很幸运,因为您的计划是 120 秒,因此您实际上可以在任何已知的 cron 表达式解析器中指定它(等于 2 分钟间隔)。
如果是 125,您将无法在任何方言中指定它。
假设您想要 45 秒的间隔。在某些 cron 表达式的方言中(例如 Quartz),您可以指定秒数。这里需要注意的是,仍然无法指定 45 秒的间隔。
考虑 cron 表达式 0/13 0/7 * * * ( https://crontab.guru/#0/13_0/7_ _ _*)。
Crontab Guru 对此表达式的解释为“从 0 到 59 的每 13 分钟,从 0 到 23 的每 7 小时”。
如果您查阅https://www.freeformatter.com/cron-expression-generator-quartz.html(基于 Quartz)并考虑表达式“0/45 * */7 ? * *”,那么表达式的描述给出的是“从 00 秒开始,每 45 秒,每分钟,每 7 小时,从每天早上 00 点开始”。
计算出的执行顺序是(从现在开始):
2019 年 3 月 6 日星期三 14:00:00 UTC 2019 年 3 月 6 日星期三 14:00:45 UTC 2019 年 3 月 6 日星期三 14:01:00 UTC 2019 年 3 月 6 日星期三 14:01:45 UTC 2019 年 3 月 6 日星期三 14:02:00 UTC 2019 2019 年 3 月 6 日星期三 14:02:45 UTC 2019 年 3 月 6 日星期三 14:03:00 UTC 2019 年 3 月 6 日星期三 14:03:45 UTC
这意味着每次你溢出一个更大的/时间容器/你都会有心律失常。只是让你知道;-)
PS 另外值得注意的是,表达式上的 7 是多余的。我们每分钟都在重新开始我们的节奏,所以这也意味着每小时。CRON 表达式很有趣 :-)