关键在于显式定义任务依赖关系,即“谁先跑、谁等谁、谁失败了怎么处理”,并用dag建模:顺序依赖(a→b)、并行依赖(a→b且a→c)、条件依赖(a结果决定走b或c),调度器需实时跟踪状态、自动触发就绪任务、支持重试与人工干预,上下文传递应轻量可靠。

实现任务依赖执行关系编排,关键不是堆功能,而是把“谁先跑、谁等谁、谁失败了怎么处理”这些逻辑显式定义清楚,并让系统能自动识别和驱动。
明确任务之间的依赖类型
依赖不是只有“串行”一种。实际中常见三种关系:
- 顺序依赖:任务B必须等任务A成功完成后才启动(如:拉数据 → 清洗 → 入库)
- 并行依赖:任务B和C都依赖A,但B和C可同时执行(如:A导出日志后,B做统计、C做告警,互不干扰)
- 条件依赖:A执行完后,根据返回值决定走B还是C(如:检查磁盘空间,够则继续部署,不够则发预警并跳过部署)
用图结构建模任务关系
任务依赖本质是一个有向无环图(DAG)。每个任务是图中的节点,箭头表示“必须先完成才能触发”。设计时注意:
- 根节点没有入边,是整个流程的起点
- 一个任务可以有多个父节点,只有全部父节点成功,它才被允许执行
- 避免循环依赖(比如A依赖B,B又依赖A),否则调度器会卡死或报错
- 建议在配置文件或可视化画布中直接绘制这种图,比写if-else更直观、易维护
调度器要能感知状态并驱动流转
定义好依赖只是第一步,调度器得真正“看懂”并执行。核心能力包括:
- 实时跟踪每个任务的状态(等待、运行中、成功、失败、跳过)
- 当一个任务完成,自动扫描所有它的子任务,检查是否满足执行条件(即所有父任务均已成功)
- 支持失败重试(如HTTP超时重试3次)、失败跳过、失败终止整个流程等策略
- 提供手动干预入口:比如某任务失败后,允许运维人员选择“重试该节点”或“跳过继续”,而不是只能重启整条流水线
变量与上下文传递要轻量可靠
上游任务的结果常需传给下游(如:脚本A生成了文件路径,脚本B要用这个路径读取)。推荐做法:
- 限制传递内容为简单类型(字符串、数字、布尔值、JSON对象),避免传大文件或复杂对象
- 用统一上下文(Context)对象承载,每个任务执行时自动注入,返回时自动提取并合并到全局上下文
- 避免在任务间通过共享数据库或文件系统传递——容易引发竞态、权限、清理等问题










