← 返回题目列表

DAG 任务失败后如何局部重试?

中等 第 25 / 25 题 更新于 2026/10/03
分布式任务调度分布式面试题架构设计
学习 AI 实战项目

简化版

局部重试不是只重跑失败节点,而是先确定失败节点的输出是否被下游消费,再按数据血缘和幂等边界选择重跑子图、复用安全产物或使后继结果失效。

回答“DAG 任务失败后如何局部重试?”时要同时说明正常流程、故障边界和验证指标,不能只报出组件名或算法名。

详细版

一次 DAG run 应冻结 DAG 版本与输入快照。节点实例至少记录 run_id、node_id、attempt、输入版本、输出版本和状态;重试 attempt 不能伪装成新的业务 run。

落地时抓住四点:

  1. 冻结本次运行的拓扑,避免重试期间发布新 DAG 改变依赖。
  2. 从失败节点沿有向边计算受影响闭包,已消费脏输出的后继必须失效。
  3. 只复用经过校验且不可变的上游产物,副作用节点使用幂等键。
  4. 重试成功后由状态机重新释放满足全部依赖的节点。

一个可量化的例子是:A→B→D、A→C→D 中 B 失败而 C 成功:若 C 的产物不可变且与 B 无关,可只重跑 B,再运行尚未启动的 D;如果 B 曾被误报成功,使 D 消费了不完整产物,则 D 也必须失效重跑。

“DAG 任务失败后如何局部重试?”的判断标准:方案不仅在正常路径能工作,还要能解释重复、超时、宕机或配置变化时如何收敛。

完整版教学

一、先定义问题与边界

一次 DAG run 应冻结 DAG 版本与输入快照。节点实例至少记录 run_id、node_id、attempt、输入版本、输出版本和状态;重试 attempt 不能伪装成新的业务 run。

本题首先要区分“业务语义”和“系统实现”。前者决定什么算同一次动作、允许多晚、能否重复;后者才决定使用数据库、消息队列、Redis、租约或本地状态。对“DAG 任务失败后如何局部重试?”而言,不先明确业务语义,技术方案很容易在异常路径上答错。

易错点:回答“DAG 任务失败后如何局部重试?”时,不能把正常路径成立当成分布式语义已经成立;必须继续检查重复、超时、节点失联和配置切换。

二、核心数据与状态

设计“DAG 任务失败后如何局部重试?”时,需要把关键决策状态持久化或限制在可重建范围内。状态应有稳定身份、版本和明确生命周期;任何会被重试或接管的动作,都不能仅靠进程内布尔值判断是否完成。

核心设计如下:

  1. 冻结本次运行的拓扑,避免重试期间发布新 DAG 改变依赖。
  2. 从失败节点沿有向边计算受影响闭包,已消费脏输出的后继必须失效。
  3. 只复用经过校验且不可变的上游产物,副作用节点使用幂等键。
  4. 重试成功后由状态机重新释放满足全部依赖的节点。

三、主流程如何运转

DAG 任务失败后如何局部重试?
  -> 输入与身份校验
  -> 读取当前规则或状态
  -> 原子地作出准入 / 所有权 / 执行决策
  -> 执行业务动作并记录结果
  -> 指标、审计与异常恢复

这条流程中,最重要的是决策与状态更新之间不能留下无法解释的窗口。对于“DAG 任务失败后如何局部重试?”,实现必须让重复请求、迟到结果和节点切换都落到同一套身份与版本规则上。

四、用数字验证容量与语义

A→B→D、A→C→D 中 B 失败而 C 成功:若 C 的产物不可变且与 B 无关,可只重跑 B,再运行尚未启动的 D;如果 B 曾被误报成功,使 D 消费了不完整产物,则 D 也必须失效重跑。

数字不是固定配置,而是说明估算方法。生产值应来自压测、历史分位数和故障演练,并为长尾、扩缩容和依赖抖动预留余量。只给阈值却不说明依据,不能证明“DAG 任务失败后如何局部重试?”已经可落地。

五、方案对比与取舍

方案优点主要代价或边界
仅重跑失败节点成本最低可能遗漏已被污染的后继
重跑失败子图正确性与成本平衡依赖准确、产物需版本化
整图重跑语义最简单耗时大且副作用风险高

“DAG 任务失败后如何局部重试?”的选型不能脱离正确性、延迟、吞吐和运维成本。通常先选择语义最清楚、故障可恢复的方案,再针对已证实的瓶颈优化,不能为了少一次存储访问而丢掉必要状态。

六、异常路径与恢复

“DAG 任务失败后如何局部重试?”需要主动演练以下异常:

  • 失败节点写出半成品却被标记失败。
  • 重试时 DAG 版本变化。
  • 多个运维人员并发发起重跑。
  • 非幂等通知或扣款被再次执行。

处理“DAG 任务失败后如何局部重试?”的异常应有上限:重试有预算,排队有长度和最老年龄,租约有过期时间,人工操作有审批和审计。结果未知时先查询、对账或等待租约收敛,不能把“没收到成功响应”直接等价为“没有执行”。

七、观测、告警与上线

“DAG 任务失败后如何局部重试?”至少要监控:节点成功率、重试次数、失效节点数、DAG 关键路径耗时、僵尸运行数。指标必须能按规则或任务版本关联发布,并避免把用户 ID、任务 ID 等无限基数直接作为时序标签。

“DAG 任务失败后如何局部重试?”的上线顺序应是先只观测,再小范围执行规则,然后逐步扩大。每一阶段同时看系统资源和业务结果;回滚不仅是恢复配置,还要处理已经创建的任务、已排队请求或已产生的副作用。

八、常见误区与追问

  • 误区:失败节点成功后 DAG 就恢复。 其后继可能已消费旧产物,必须按血缘判断是否失效。
  • 误区:成功节点永远可以复用。 只有输入和代码版本一致、产物完整且不可变时才可复用。
  • 追问:如何处理副作用节点? 用业务幂等键、outbox 或人工确认隔离不可逆操作。
  • 追问:谁决定可运行? 调度器以冻结拓扑和持久化状态判断全部前驱成功后再释放。
  • 追问:整图重跑何时更合适? 血缘不可信或产物无法校验时,整图重跑更保守。

九、加强记忆

回答“DAG 任务失败后如何局部重试?”时可以按“语义、身份、原子性、边界、观测”展开:先定义业务语义和稳定身份,再说明关键决策如何原子完成;随后覆盖超时、重复、宕机与配置变化,最后用容量数字和指标证明方案能够收敛。