早上第一张报表是空的,没人知道夜里停在哪一步:前一晚的数一条没有,值班说页面能打开,运维说机器没报错。真正的问题在中间那段,夜里的活到底跑没跑完,谁也拿不出一句准话。票务系统的定时任务最怕这种状态,没成功也没失败,就那么悬着,第二天才被报表戳破。

票务系统看任务,先看结尾那一行
任务日志要看结尾,不看开头。开头那行只说明它起过身,结尾那行才说明它走完了;中间断掉的任务,两行之间会空出一段。完成标记要单独写一条,别指望从最后一条业务记录去推。售票系统里跑批的活不少,凡是关键任务都得有这条标记,缺了就等于没跑。失败告警配得再全,也得先有这条标记才对得上号。
一张表停在凌晨,算不算证据
数据表的最后更新时间,是第二重证据。它停在凌晨,说明写到最后一步就断了;它停在开园前,说明任务跑完了,只是报表的取数口径不对。定时任务的失败有时不报错,只把一半数据写进去就停下,表更新时间会替它说话。两处一对,才分得清是没跑,还是跑了没跑完。
失败告警不超十分钟送达,这条要落到人头上。告警发给谁,得写名字,不能只写一个群。值班先收,运维同时收,两条线都亮着,才不会出现“我以为他看到”的场面。告警里要有任务名、失败步骤和最后一条日志的时间,光写一句失败,等于让人从头再查。
重跑从哪一步起,提前写下来
失败了自动重跑还是等人点,取决于这一步能不能重复执行。取数、汇总这类可以整段重来的,自动重跑一次无妨;写凭证、发通知这类有副作用的,必须等人确认。补跑口径要提前写:从哪一步起、要不要清掉半截数据、跑完怎么验。定时任务的重跑按钮放在谁手里,也要写在口径里。
重跑要不要从头来,也是个容易被跳过的问题。数据量大的任务从头跑,往往赶不上开园;从断点续要快得多,但得先确认断点之前那批数据是完整的。补跑口径里写一句“从失败步骤续跑,先校验前序批次”,能省掉很多现场争论。售票系统的报表任务尤其如此,晚一会儿,等着进园的人就排到了门口。
晨检查法很朴素:先翻任务日志的结束那一行有没有,再看当日数据表的最后更新时间是不是停在凌晨。两处一对,是没跑还是跑了没跑完,当场就能分开,补跑须在开园前完成。连续两日如此,运维要把这几支任务列成晨检清单,逐支补上完成标记,跨月的那部分另注。票务系统的补跑口径写进值班交接,失败告警响过之后先补哪一支也有个先后。

省下的三分钟,往往在别处还回去。一种等业务发现数据不对再回头查,早班能省三分钟,代价是发现时已经开园,补都来不及。一种每天开园前扫一眼这套票务系统的定时任务看板,三分钟,停在哪一步当场就知道。失败告警响得再快,也不如这三分钟看得明白。
上游数据没到,任务空跑一趟,这一类不记故障。这一笔由运维在任务日志里写清等待时长,复核人签系统管理员。空跑也算一次执行,别把完成标记点亮了就算完;标记亮了,第二天还得手动补一轮。补跑口径里要留这一条,售票系统的换票数据晚到一会儿是常事。
