首页/数据/数据工程与 ETL 速查/重试策略与告警分级

重试策略与告警分级

重试要区分错误类型:网络抖动、资源竞争适合自动重试;数据质量问题、代码缺陷重试只是延迟告警。告警要分级并带上下文(任务、业务日期、日志链接)。

重试要区分错误类型

重试不是万能药:网络抖动、资源竞争、下游短暂不可用这类瞬时故障适合自动重试;数据质量问题(脏数据导致 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 分钟后才彻底暴露,关键路径的重试窗口要按承诺产出时间倒推设定。
把重试状态与失败状态区分开:「重试中」不应触发告警,否则一次抖动会连发数条通知,真正的严重问题反而被淹没在噪音里。

易错点

  • 把数据错误也自动重试,形成反复失败与重试的循环,掩盖了真正的根因
  • 告警不带业务日期,值班无法判断影响范围,沟通成本翻倍
  • 重试窗口比承诺产出时间还长,等告警发出时业务方已经在催了
  • 所有失败都走同一条通知渠道,告警之间没有区分,重要故障被噪音淹没

数据来源与参考

  • Apache Airflow 官方文档:Task Retries 与 Email 告警配置
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌