1. 课程导学与故障排查全景图

本课程面向具备 Spring Boot 基础、但希望系统掌握定时任务生产级故障排查能力的开发者与运维工程师。课程围绕 任务调度 DAG 边界 这一核心视角,从单机定时任务出发,逐步深入到分布式调度、有向无环图(DAG)依赖编排、资源竞争、线程池隔离、任务超时与重试等真实故障场景。

1.1 课程目标与学习路径

模块 核心目标 关键产出
基础篇(第1-5章) 掌握 Spring Boot 定时任务底层原理与常见故障模式 故障分类清单、线程池监控脚本
进阶篇(第6-15章) 深入 DAG 调度模型、任务依赖与资源竞争排查 DAG 拓扑分析工具、死锁检测方案
实战篇(第16-25章) 生产级故障复现、日志分析与性能调优 故障排查 SOP、监控告警规则
总结篇(第26-30章) 构建企业级定时任务治理体系 治理清单、自动化巡检脚本
学习建议: 每章均包含可复现的故障案例与排查步骤,建议在本地搭建 Spring Boot 2.7+ 测试环境,配合本章提供的 DAG 调度模拟器进行实操。

1.2 定时任务故障排查宏观方法论

故障排查不是随机试错,而是遵循 「现象 → 定位 → 根因 → 修复 → 验证」 的闭环流程。本课程将方法论归纳为以下五个阶段:

  1. 现象采集:任务未执行、执行延迟、执行失败、数据不一致、系统资源异常。
  2. 快速定位:通过日志、监控、线程 dump、数据库锁状态缩小范围。
  3. 根因分析:区分代码缺陷、配置错误、资源竞争、依赖超时、DAG 死锁。
  4. 修复实施:代码热修复、配置调整、资源扩容、调度策略变更。
  5. 验证与复盘:回归测试、监控确认、故障文档沉淀。
核心原则: 先看日志,再看线程,最后看数据。不要跳过日志直接改代码。

1.3 DAG 调度模型概述

传统定时任务(如 @Scheduled)是独立执行的,任务之间没有依赖关系。但在复杂业务中,任务 A 完成后才能执行任务 B,任务 B 和 C 可以并行,最后汇总到任务 D——这就是 有向无环图(DAG)调度模型。

DAG 模型的关键要素:

  • 节点(Node):每个定时任务实例,包含执行逻辑、超时时间、重试策略。
  • 边(Edge):任务间的依赖关系,方向表示执行顺序。
  • 入度(In-degree):指向该节点的边数,入度为 0 表示可立即执行。
  • 拓扑排序:确定任务执行顺序的算法,环的存在会导致调度死锁。
DAG 调度模型结构图 任务 A 入度: 0 任务 B 入度: 1 任务 C 入度: 1 任务 D 入度: 2 任务 E 入度: 1 依赖 依赖 依赖 依赖 依赖 说明: • 任务 A 入度为 0,可立即执行;B、C 依赖 A 完成后才能启动。 • 任务 D 依赖 B 和 C 都完成后才能执行;E 依赖 D。 • 若 B 或 C 任一任务卡死,D 将永远无法执行,形成调度阻塞。

1.4 故障排查全景图

基于 DAG 调度模型,我们将定时任务故障归纳为以下四大类,每类对应不同的排查路径:

故障类别 典型现象 排查切入点 本课程对应章节
调度引擎故障 任务未触发、cron 表达式失效 线程池状态、ScheduledTaskRegistrar 第2-4章
任务执行故障 任务超时、抛出异常、内存泄漏 日志、堆栈、AsyncConfigurer 第5-8章
DAG 依赖故障 任务死锁、循环依赖、上游失败导致下游阻塞 拓扑排序、入度分析、超时链 第9-15章
资源竞争故障 数据库死锁、分布式锁失效、线程池耗尽 锁监控、连接池、分布式协调 第16-22章
定时任务故障排查全景流程图 故障现象采集 调度引擎故障? 执行故障? DAG 依赖故障? 资源竞争故障? 检查线程池状态 cron 表达式 分析异常堆栈 超时日志 拓扑排序检查 入度分析 锁监控 连接池状态 根因修复与验证 提示:故障分类是排查的第一步,错误的分类会导致排查方向完全偏离。建议先通过日志关键字快速归类。
常见误区: 不要一上来就怀疑代码逻辑。统计显示,超过 60% 的定时任务故障与线程池配置、依赖超时、资源竞争有关,而非业务代码本身。

1.5 本章小结