fix(automation): 调度心跳与作业周期解耦,修掉系统性跳轮
线上现象:同一页面上「CK 自动巡检」的最近运行是 21:45:34,而「下次运行」显示 21:50:34 且已经过去了 —— 巡检明明只要 19 秒,却总是等在那里。 根因是把心跳周期直接当成了作业周期:TICK_SECONDS=300 既是「循环多久醒一次」, 又被写进 next_run_at = 作业结束 + 300s。两者同频会系统性跳轮: 心跳 t=0 ck_health 19 秒跑完 → next = 5:19 心跳 t=5:00 差 19 秒没到点 → 整轮空转,什么都不做 心跳 t=10:00 才真正跑到 于是作业实际是每 10 分钟一轮,而不是设计的 5 分钟;只要作业耗时不是刚好 0, 就会稳定地"差一点点"被跳过。两个作业共享同一个心跳时,还会互相把对方的到期 时刻推后。 改动: - 拆成两个常量:TICK_SECONDS=30(心跳,只做「有没有到点的作业」检查,几乎不 耗资源)、JOB_INTERVAL_SECONDS=300(作业周期,跑完一轮后隔多久再跑)。 - next_run_at 改用 JOB_INTERVAL_SECONDS。 - /api/automation/jobs 的 scheduler 同时暴露两个值;启动日志一并打印。 - 页面:「单账号重检间隔」加 tooltip 说明它不决定调度频率(它只控制同一行多久 重检/重试),避免和调度周期混淆。 回归测试(3 条):心跳必须比作业周期密至少 4 倍;周期未到时连跳多次心跳都不跑; 把 next_run_at 拨到过去后下一次心跳必须跑到。 全量 304 通过。
This commit is contained in:
@@ -877,7 +877,10 @@ export interface AutomationJobItem {
|
||||
export interface AutomationSchedulerStatus {
|
||||
enabled: boolean;
|
||||
running: boolean;
|
||||
/** 调度心跳(轮询间隔),比作业周期密,只做「有没有到点」的检查。 */
|
||||
tick_seconds: number;
|
||||
/** 作业周期:同一个作业跑完一轮后隔多久再跑下一轮。 */
|
||||
job_interval_seconds: number;
|
||||
registered: string[];
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user