目标
用 sleep 600 串起来的 cron 链,本质上是在赌上游的速度——月初月末赌输时,下游静默读到半截数据。改成依赖就绪触发,赌局消失;分支隔离让一处失败不再作废整晚的产出;告警对准业务截止线而不是每次重试。
步骤要点
- 建模数据依赖而非钟表时间:每个任务声明依赖哪些上游数据集或任务完成,删掉 sleep 与开始时间猜测。
- 按分支隔离故障:失败策略配置为只阻塞自己的下游,独立分支继续跑。
- 让关键路径可见:给任务打点并渲染 DAG 关键路径,调度优化瞄准真正卡完成时间的那条链。
- 回填做成一等模式:任务按逻辑日期参数化,重跑过去窗口复用同一张图且不干扰当前运行。
- 对截止线告警:SLA 告警设在管道完成与关键里程碑上,不为单任务重试打页。
排错提示
月末数字总差一点是时间链在赌输,把 sleep 换成依赖信号;一处失败全线停摆说明没做分支隔离,配置失败只传染下游依赖者;回填要手工改图是任务没按逻辑日期参数化,回填与正常跑应共用同一依赖图。
适用边界
依赖编排要求上游有明确完成信号,无信号的黑盒数据源只能退回时间调度加数据校验;复杂 DAG 的可见性依赖良好的工具渲染,超大图需要分层抽象。
代码示例
cron chain (fragile):
00:30 extract; 00:35 transform; 00:40 load
(extract runs 22 min on month-end -> partial read)
DAG (dependency-based):
extract >> [clean, enrich]
clean >> load_core
enrich >> load_enriched >> reports
month-end: extract 22 min -> downstream auto-shifts
enrich fails 01:10Z: load_core + reports STILL RUN
(branch isolation)
SLA: pipeline done by 04:00Z -> alert 03:40Z only