这个坑值得记一笔。每五分钟跑一次的 CronJob,单轮实际要八分钟,Allow 策略下同时有两个 Job 在跑,同一批订单被汇总了两次,报表数字翻倍。

刚开始盯着「没有分布式锁,两个 Job 同时写同一张表」,折腾了半个多小时,排掉了。

真正麻烦的地方在于,几个原因的现象几乎一样。concurrencyPolicy 是 Allow,不阻止重叠;任务耗时已经超过调度间隔;lastScheduleTime 判断在容器内不可靠。

第一件事是看同时有几个 Job 在跑

kubectl get jobs -l app=summary --sort-by=.metadata.creationTimestamp

再往下把并发策略改成 Forbid

kubectl patch cronjob summary --type merge -p '{"spec":{"concurrencyPolicy":"Forbid"}}'

然后在业务侧再加一把分布式锁

redis-cli SET lock:summary:daily $HOSTNAME NX EX 900

补一次去重把重复汇总清掉

python dedupe_summary.py --date 2024-08-01 --table daily_summary

改之前先确认了最近有没有人动过配置,避免白查一遍。

怎么算真的好了,看的是同一批现象。同一时间只有一个 Job 在跑,报表数字回到正常量级,日志里不再出现两次相同汇总。

调度间隔必须大于任务耗时,做不到就用 Forbid 加锁两层保护,光靠调度器挡不住慢任务。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189