定时任务上一轮没执行完,下一轮又触发了怎么办?
简化版
上一轮任务没执行完又触发下一轮时,需要根据业务选择阻塞策略:串行等待、丢弃后续、覆盖旧任务、并发执行或终止旧任务。核心判断是任务是否允许并发、是否有顺序要求、重复执行是否安全。
详细版
常见处理策略:
| 策略 | 含义 | 适用场景 |
|---|---|---|
| 串行等待 | 下一轮排队等上一轮完成 | 有顺序要求的任务 |
| 丢弃后续 | 上一轮运行中则跳过本轮 | 高频刷新、可丢任务 |
| 并发执行 | 多轮同时跑 | 分片独立、无共享资源 |
| 覆盖旧任务 | 新任务替代旧任务 | 只关心最新状态 |
| 终止旧任务 | 杀掉旧任务跑新任务 | 少用,需任务可安全中断 |
面试中要强调:默认不要让同一任务无限并发,否则可能造成数据重复、锁冲突、数据库压力暴涨。任务要设置超时、执行状态和告警。
完整版教学
一、为什么会出现任务重叠
任务重叠通常发生在任务周期短、执行时间不稳定的场景。
比如任务每 5 分钟执行一次,但某次因为数据库慢查询跑了 12 分钟:
00:00 第一轮开始
00:05 第二轮触发
00:10 第三轮触发
00:12 第一轮结束
如果不控制,第二轮和第三轮可能同时执行,造成重复处理和资源竞争。
二、串行等待适合什么场景
串行等待适合有顺序要求的任务。例如按时间推进的数据同步任务,必须先同步 10:00 前的数据,再同步 10:05 前的数据。
串行的好处是顺序清楚,不容易并发冲突。缺点是如果任务一直变慢,队列会越积越多,延迟越来越大。
所以串行任务要配合超时和积压告警。如果任务周期是 5 分钟,但平均执行 20 分钟,真正应该做的是优化任务或调整周期,而不是让它一直排队。
三、丢弃后续适合什么场景
丢弃后续适合只需要周期性刷新、不要求每轮都执行的任务。
例如每分钟刷新一次热点商品缓存。如果上一轮还没刷新完,本轮可以跳过,因为继续并发刷新意义不大,还会加重压力。
这种策略要确认跳过不会造成业务缺口。对账、账单、资金类任务通常不能随便丢弃。
四、并发执行为什么危险
并发执行只有在任务之间完全独立时才安全。
危险点包括:
- 两轮任务处理同一批数据,造成重复写。
- 多个任务同时扫大表,数据库压力上升。
- 同一外部接口被并发调用,触发限流。
- 共享临时文件或缓存 Key 被覆盖。
如果必须并发,需要按分片、业务范围、任务参数隔离,并保证幂等。
五、终止旧任务为什么要谨慎
终止旧任务看起来干净,但很多任务不是可安全中断的。
例如任务已经发放了部分奖励,强行中断后如果没有进度记录和补偿机制,下一轮不知道从哪里继续。更糟糕的是,外部接口调用可能已经成功,本地还没记录。
所以终止策略只适合明确支持中断和恢复的任务。否则更推荐让旧任务完成,或者通过状态标记让它自己安全退出。
六、常见误区与追问
这道题要紧扣「任务阻塞策略」本身回答,不能把它混成泛泛的分布式任务调度套话。面试官通常会沿着“为什么需要、流程怎么走、失败怎么兜、代价是什么”继续追问,所以回答要覆盖调度触发、分片分配、抢占锁、失败重试、超时控制、幂等和高可用。
| 回答层次 | 要讲清的内容 | 容易漏掉的边界 |
|---|---|---|
| 核心结论 | 阻塞策略决定上一次任务未完成时下一次触发如何处理,常见丢弃、并行、覆盖或排队 | 不要停在名词解释 |
| 流程机制 | 到达调度时间 -> 检查上次执行状态 -> 按策略丢弃/并行/排队 -> 记录触发结果 -> 执行或跳过任务 -> 监控积压和耗时 | 要说清触发点、状态变化、确认点和失败兜底 |
| 工程取舍 | 任务每 1 分钟触发一次但执行 3 分钟,如果不设策略,可能并发堆出多个相同任务 | 任务调度提升自动化和吞吐,但必须处理重复执行、漏执行、积压、超时和故障恢复 |
任务阻塞策略 面试拆解:
1. 到达调度时间
2. 检查上次执行状态
3. 按策略丢弃/并行/排队
4. 记录触发结果
5. 执行或跳过任务
6. 监控积压和耗时
记忆钩子:先给结论,再拆流程,再讲数字例子和失败边界;回答「任务阻塞策略」时要围绕题目问法收束,不要把相邻概念堆成一段没有重点的名词清单。
- 误区:任务触发越准时越好。 如果上次未完成,强行准时并发可能造成重复写和资源打满。
- 误区:所有任务都适合并行执行。 有状态写任务并行可能破坏顺序或重复处理。
- 误区:丢弃后不用记录。 丢弃也要有日志和指标,否则业务会以为任务正常完成。
- 追问:慢任务怎么选阻塞策略? 可重入读任务可并行,状态写任务更适合丢弃后续或串行排队。
- 追问:如何避免长期阻塞? 设置超时、拆分分片、优化任务和告警。
- 追问:阻塞和 misfire 区别? 阻塞关注上次未完成,misfire 关注调度时间错过。
七、加强记忆
上一轮没跑完时,不要默认并发开跑。先判断任务能不能并发、能不能丢、有没有顺序要求;账单对账偏串行和补偿,缓存刷新可跳过或合并,大批处理要靠分片隔离和幂等兜底。