每周报表设置为“每周一 9:00”运行,几个月来一直准时送达。后来遇到夏令时切换,一个办公室的同事提前一小时收到,另一个办公室晚了一小时。又过了几周,服务器在周一早上重启,报表干脆没有发出来。
定时任务看起来很简单,因为计划只有一行。但这一行背后的问题,最好在上线前就有答案。
用业务语言写出计划
从业务需要出发,而不是从调度工具的设置出发。例如:“销售汇总必须在新加坡时间周一 9:30 例会前发到团队邮箱。”
从这句话可以确定:
- 按哪个时区运行,以及是否跟随夏令时变化。
- 最晚可接受的时间,而不只是开始时间。
- 任务覆盖哪个时间段,例如上周一到周日,这样即使晚跑,也能处理正确的数据。
把时区明确写进配置。不带时区的“9:00”,只是在猜服务器位于哪里。
约定节假日和休息日怎么办
有些任务每天都要跑,有些应该在公共假期跳过,或顺延到下一个工作日。约定好规则,写明节假日日历来自哪里,并指定专人每年更新。
发现漏跑
任务根本没有启动,就不会产生任何报错。增加一项检查:在最晚可接受时间之前,查找应有的结果,例如文件、报表或日志记录。找不到就通知具体负责人。
怎样让这条告警真正有用,可参考让人真正会处理的自动化告警。
补跑时不要重复执行
漏跑后,要决定是为漏掉的时间段单独补跑一次、直接跳过,还是并入下一次运行。任务应以覆盖的时间段为准,而不是“从上次到现在”,这样补跑只会处理漏掉的那段时间。
重跑之前,先检查任务是否已经部分完成。如果部分邮件已发出或部分记录已写入,完整重跑可能造成重复。如何让重跑更安全,可参考自动化重试不重复执行指南。
避免长任务互相重叠
如果任务有时运行时间超过间隔,下一次可能在上一次结束前就启动了。要决定第二次是等待、跳过,还是终止第一次。记录每次运行的开始、结束时间和覆盖时间段,让重叠情况一目了然。
每年检查两次
在夏令时切换前和每年年初各检查一次:确认时区、节假日规则、负责人,以及每个任务是否仍然需要。
如需检查业务流程背后的定时任务,欢迎联系 Storm Nova Labs。