队列调度器槽位泄漏:DB 有在途却全局满载的真相
调度器出现一个诡异现象:DB 里明明没有 running 的任务,但全局在途数却显示满载,新任务全部卡在"等待中"。
根因
计数器的加法在入队前执行,减法在 Job 收尾时执行。当 worker 被 supervisor 重启或超时被杀,Job 永远不会收尾,计数器就一直停在高位。
修复思路
- 调度前在 同一把锁内用 DB 实况校正计数器:
count(status="running"),差值用 add/dec 补齐。 - 以 DB 行数为权威在途数,Redis 只作影子。
- 排查口诀:0 在途却全局满载,必然是泄漏。