038、Cron 定时任务系统:CronCreate、CronList、CronDelete 的持久化调度与可靠性
038、Cron 定时任务系统:CronCreate、CronList、CronDelete 的持久化调度与可靠性
从一次凌晨3点的告警说起
上周四凌晨3点17分,手机震醒了。Prometheus告警:cron_job_execution_lag_seconds阈值突破30秒。我迷迷糊糊爬起来看日志,发现一个本该每5分钟执行一次的数据清洗任务,实际间隔变成了47分钟。更诡异的是,任务明明在CronList里显示“正常”,但执行记录却断断续续。
排查到最后,问题出在Claude Code生成的CronCreate接口——我把任务的调度表达式写死了*/5 * * * *,但没考虑到任务执行超时后的重叠问题。当上一个任务还在跑,下一个调度触发时,系统直接跳过了。这不是Claude Code的锅,是我自己没在CronCreate里做并发控制。
这个教训让我重新审视了整个Cron定时任务系统的设计。今天这篇笔记,就围绕CronCreate、CronList、CronDelete三个核心接口,聊聊持久化调度和可靠性那些坑。
CronCreate:别让任务“静默丢失”
CronCreate看起来简单——接收任务名称、Cron表达式、执行命令,存到数据库就完事。但实际踩过的坑比想象的多。
