重试要区分错误类型
重试不是万能药:网络抖动、资源竞争、下游短暂不可用这类瞬时故障适合自动重试;数据质量问题(脏数据导致 SQL 报错)和代码缺陷重试多少次都还是失败,只是把告警推迟了几分钟。告警本身也要分级并带上上下文——任务名、业务日期、日志链接——否则值班拿到通知也不知道影响哪天的数、该不该立刻起来处理。
基本信息
| 重试参数 | retries、retry_delay,必要时使用指数退避 |
|---|---|
| 重试判据 | 瞬时故障自动重试,数据与代码问题直接失败告警 |
| 告警分级 | 失败告警、超时告警、连续失败升级 |
| 告警上下文 | DAG 与任务名、业务日期、执行实例链接 |
典型使用场景
- 调用外部接口的任务:网络抖动类失败自动重试
- 依赖上游产出:上游晚到造成的失败靠重试自动接上
- 数据质量失败:不重试,直接告警并阻断下游
- 连续失败升级:同一任务连续多天失败要升级到更高级别通道
- 大促与月末:临时放宽重试窗口,避免短时抖动引发告警风暴
Airflow 重试与告警示例
Airflow 重试与告警示例
from datetime import timedelta
default_args = {
'retries': 3, # 瞬时故障最多重试 3 次
'retry_delay': timedelta(minutes=5), # 基础间隔 5 分钟
'retry_exponential_backoff': True, # 间隔逐次放大,避免持续冲击下游
'email_on_failure': True,
'email': ['data-oncall@example.com'],
}
dag = DAG('daily_orders', default_args=default_args, schedule='0 2 * * *')
# 数据质量类任务应显式设 retries=0,让它尽快暴露而不是被拖延告警分级参考
| 级别 | 触发条件 | 响应方式 |
|---|---|---|
| 提示 | 单次失败但重试后成功 | 记录,进日报统计 |
| 警告 | 重试耗尽仍失败 | 值班关注,判断是否人工介入 |
| 严重 | 连续多日失败或关键链路失败 | 立即响应并通知业务方 |
| 紧急 | 超过承诺产出时间仍未就绪 | 拉起应急,同步影响范围 |
重试次数乘间隔决定最晚告警时间:3 次每次 5 分钟意味着故障要 15 分钟后才彻底暴露,关键路径的重试窗口要按承诺产出时间倒推设定。
把重试状态与失败状态区分开:「重试中」不应触发告警,否则一次抖动会连发数条通知,真正的严重问题反而被淹没在噪音里。