DAGDirected Acyclic Graph
你可能会说
十个任务互相依赖,怎么排才能顺序对、又能同时跑,还不会互相卡死?
DAG(有向无环图)是带方向的依赖图:箭头表示谁要先做完,并且顺着箭头走不能绕回起点。例如上线检查里,构建要先跑,单测和文案检查可以同时跑,最后才生成汇总报告;要是写成「汇总报告 → 又回到构建」,图里就有了环,调度器会直接拒绝执行。
也常被叫作有向无环图Directed Acyclic Graph依赖图
运行结构 · 节点、依赖边、无环
① 节点构建 / 单测 / 汇总报告→② 依赖边汇总要等构建和单测都完成→③ 无环顺着箭头走,回不到起点④ 拓扑顺序:先跑没有前置的,单测和文案检查同时跑
⑤ 拒绝执行成环 → 报错前置失败 → 下游不跑
一个具体任务:构建、单测、汇总报告。节点只说做什么,先后由边决定
从 A 指向 B,表示 B 要等 A 完成。数一数还有几个前置没完成,就是入度
顺着箭头走不能回到出发的节点。出现回路,说明有两步在互相等
入度为 0 的先跑,互不依赖的可以同时跑;任务再多也照这个顺序排
跑之前先查有没有环、依赖是否存在;有问题当场拒绝,不等跑到一半才发现
容易混淆?这样区分
DAG≠流程图
流程图允许画回路表示「返工」,人看得懂就行;DAG 要交给调度器执行,回路意味着有两步永远互相等,跑之前就会被拒绝。
DAG≠Agent 循环
循环是走一步看结果再定下一步,路线不固定;DAG 提前把依赖写死,适合步骤清楚的批处理。两者常叠着用:DAG 管整体顺序,某个节点里放一个 Agent。
常见做法 · Variants
交给调度器Airflow / Spark
写依赖→按图跑
依赖写在配置或代码里,自带重试、回填和可视化;要学它那套写法,几个小任务会显得重
自己排依赖Topological sort
数入度→先跑 0 的
几十个任务够用,不用引入框架;并行、超时、失败后从哪继续,都得自己写
让 Agent 自己排No graph
模型判断→下一步
探索类任务更灵活;同一个任务跑两次步骤可能不一样,出了问题不好复现
典型使用场景
十份材料一起整理:三组并行抽取,再统一汇总
抽取 1-4抽取 5-7抽取 8-10
汇总 等三组都完成,再合并成一份
第 6 份失败:只重跑那一组,另外两组不用重来
上线检查:有一项没过,汇总报告不生成
构建 ✓单测 ✓文案检查 ✕
汇总报告 前置没全过,不生成
下游停在原地,不用等人发现报告缺了
延伸阅读 · 权威出处