← 中文资源

简体中文版本

管道失败重放工作流

用幂等任务重放受影响窗口恢复管道故障,保全输入并跳过已完成的阶段。

阅读英文原文

目标

管道故障后的两种粗暴恢复都很贵:整夜全量重跑,或者手工修补产物。用完成度台账加窗口级幂等重放,恢复成本恰好等于被中断的那一个阶段——四分钟而不是四十一分钟,且重放跑两遍结果不变。

步骤要点

  1. 每阶段记录完成度:台账映射阶段、窗口与状态,恢复时精确知道断在哪一步。
  2. 冻结失败窗口:标记 needs-replay,防止下游读到半成品状态。
  3. 从失败阶段重放:复用已完成的上游产物,只重执行中断点之后的阶段。
  4. 在合并点验证幂等:写入型任务按窗口加实体键做 upsert,重放既不重复也不丢行。
  5. 对账收尾:行数、合计、键不变量核对通过后,才清除 needs-replay 标记。

排错提示

重放后出现重复行是合并点没做 upsert,键要含窗口与实体双层;重放两次结果不同说明任务读了可变上游状态,把任务约束成窗口与输入的纯函数;恢复期间报表已引用了半成品是没冻结窗口,needs-replay 标记必须对下游可见。

适用边界

重放依赖输入留存,过期即清理的源需要先延长保留窗口;上游数据在故障期间继续变化时,重放结果与“当时本应的结果”可能有合法差异,要对账说明。

代码示例

ledger (stage x window):
  extract    10-22   done 00:33Z
  clean      10-22   done 00:36Z
  enrich     10-22   FAILED 00:39Z   <- interrupted
  load       10-22   pending

recovery 09:12Z:
  replay 10-22 from enrich (reuse extract+clean outputs)
  enrich   00:39 -> 09:14 (2 min, 1 stage)
  load     09:14 -> 09:15
  reconcile: rows 2.0M, total matches source +/- 0
  flag cleared 09:16Z

cost: 4 minutes (vs 41 min full re-run)