把定时任务做稳:锁、重试与幂等

把定时任务做稳:锁、重试与幂等

AI 摘要

通过文件锁、重试机制和幂等设计,确保定时任务稳定执行,避免数据重复处理和锁等待问题。

由 AI 生成,仅供参考

一月上旬出了个小事故。每天凌晨三点的清理任务,某天数据量突然变大,执行时间超过了调度间隔,第二个实例跟着启动了。

两个进程删同一批数据,一个刚删完,另一个按旧快照再删一遍。日志里全是「记录不存在」,还带出了几次锁等待。凌晨三点十四分,我被告警吵醒。

修法不复杂。任务开头加了文件锁,用 LOCK_NB 非阻塞模式:上一个实例没跑完,这一个直接退出。

$fp = fopen('/tmp/dino-cron.lock', 'c');
if (!flock($fp, LOCK_EX | LOCK_NB)) { exit; }

锁解决并发,重试解决失败。第三方接口超时是常态,现在统一改成有限三次、间隔递增,超过上限就记日志,等下一轮调度。

最后一道防线是幂等。删除类任务按条件删,天然可以重跑;统计类从「累加」改成「每次按源数据重算」,重复执行也不会算错。

顺手建了一张执行历史表,记开始时间、结束时间、处理条数。后来排查「任务为什么没生效」,基本一次查询就有答案。

那次之后,凌晨的告警再没响过。

相关文章

分享 微博 X TG .md
字体 字号

评论(0)

登录后才能发表评论。去登录 →

还没有评论,来抢沙发吧~