Apache Airflow 系列教程 | 第30课:Deadline 与 SLA 管理

news2026/5/11 19:03:15
导读(Introduction)在生产环境中运行的数据管道,"按时完成"往往和"正确完成"同样重要。当一个关键的每日报表管道必须在早上 8 点前完成,或者当一个下游系统依赖的数据必须在特定时间窗口内准备就绪时,仅仅依靠"失败后告警"是不够的——我们需要一种前瞻性的超时监控机制。Apache Airflow 3.x 引入了全新的Deadline(截止时间)机制,取代了旧版本中较为简单的 SLA Miss 功能。Deadline 机制提供了一套完整的超时管理框架:从声明式的截止时间定义,到灵活的时间参考点计算,再到可配置的回调通知。它不仅能告诉你"任务超时了",还能基于历史运行时间智能地预测"合理的完成时间应该是多少"。本课将深入分析 Deadline 机制的核心模型设计(Deadline、DeadlineAlert)、SDK 层的声明式接口(DeadlineReference、DeadlineAlert)、Scheduler 层的超时检测逻辑,以及回调系统如何将告警通知传递到外部系统。通过源码分析,你将全面理解这一机制的内部运作,并能够为自己的关键管道配置有效的超时保护。学习目标(Learning Objectives)完成本课学习后,你将能够:理解 Deadline 的设计理念——区分 Deadline 与传统 SLA 的差异,明确其前瞻性超时管理定位掌握 DeadlineAlert 配置模型——深入分析 Reference、Interval、Callback 三要素剖析多种 DeadlineReference 实现——理解 LogicalDate、QueuedAt、FixedDatetime、AverageRuntime 四种参考点的计算逻辑理解 Deadline 生命周期——从创建到检测超时、触发回调、成功清理的完整流程分析 Scheduler 的超时检测机制——FOR UPDATE SKIP LOCKED在 HA 环境下的并发安全处理实践 Deadline 配置——为关键数据管道配置有效的 Deadline 告警策略正文内容(Main Content)1. Deadline 设计理念与架构1.1 从 SLA Miss 到 Deadline在 Airflow 2.x 中,SLA(Service Level Agreement)机制提供了基础的超时检测能力。然而,旧的 SLA 机制存在明显局限:特性Airflow 2.x SLAAirflow 3.x Deadline参考时间点固定使用 execution_date可选多种参考点(logical_date、queued_at、固定时间、平均运行时间)粒度Task 级别DAG Run 级别回调方式邮件通知支持异步/同步回调,可路由到 Triggerer 或 Executor智能预测无基于历史平均运行时间动态计算HA 安全无保障FOR UPDATE SKIP LOCKED 防重复触发清理机制手动DAG Run 成功时自动清理未触发的 Deadline1.2 Deadline 核心概念Deadline 机制围绕三个核心概念构建:┌─────────────────────────────────────────────────────────────┐ │ DeadlineAlert(告警定义) │ │ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │ │ │ Reference │ │ Interval │ │ Callback │ │ │ │ 参考时间点 │ +│ 偏移量 │ →│ 超时触发的回调 │ │ │ │ │ │ timedelta │ │ (Async/Sync) │ │ │ └─────────────┘ └─────────────┘ └─────────────────────┘ │ └─────────────────────────────┬───────────────────────────────┘ │ 每个 DAG Run 创建时 ▼ ┌─────────────────────────────────────────────────────────────┐ │ Deadline(截止时间实例) │ │ │ │ deadline_time = Reference.evaluate() + Interval │ │ missed = False → Scheduler 检测超时后 → missed = True │ │ callback → 触发 TriggererCallback 或 ExecutorCallback │ └─────────────────────────────────────────────────────────────┘三个核心要素的职责:Reference(参考点):确定"从什么时间开始计算"——可以是 DAG Run 的逻辑日期、入队时间、固定时间点,或基于历史的平均运行时间Interval(偏移量):确定"允许多长时间"——一个timedelta加在参考点上得到最终截止时间Callback(回调):确定"超时后做什么"——支持异步回调(运行在 Triggerer)和同步回调(运行在 Executor)1.3 Deadline 生命周期DAG 定义 DeadlineAlert │ ▼ (DAG 序列化) DeadlineAlert 持久化到 deadline_alert 表 │ ▼ (DAG Run 创建时) 评估 Reference + Interval → 计算 deadline_time │ ▼ 创建 Deadline 记录(missed=False) │ ├─── DAG Run 在 deadline_time 前完成 → prune_deadlines() 删除记录 │ └─── deadline_time 到期时 DAG Run 仍在运行 │ ▼ (Scheduler 轮询检测) deadline.handle_miss() → 标记 missed=True → 触发 Callback2. SDK 层:DeadlineAlert 声明式接口2.1 DeadlineAlert 类用户通过 Task SDK 中的DeadlineAlert类为 DAG 配置截止时间。定义在task-sdk/src/airflow/sdk/definitions/deadline.py:# 源码位置:task-sdk/src/airflow/sdk/definitions/deadline.pyclassDeadlineAlert:"""Store Deadline values needed to calculate the need-by timestamp and the callback information."""def__init__(self,reference:DeadlineReferenceType,# 参考时间点interval:timedelta,# 偏移量callback:Callback,# 超时回调name:str|None=None,# 可选名称):self.reference=reference self.interval=interval self.name=name# 验证回调类型ifnotisinstance(callback,(AsyncCallback,SyncCallback)):raiseValueError(f"Callbacks of type{type(callback).__name__}are not currently supported")self.callback=callback关键设计要点:只接受AsyncCallback(异步,运行在 Triggerer)和SyncCallback(同步,运行在 Executor)name是可选字段,用于在 UI 中标识不同的 Deadline 告警实现了__eq__和__hash__,支持去重2.2 DeadlineReference 统一接口DeadlineReference类提供了用户友好的工厂接口:# 源码位置:task-sdk/src/airflow/sdk/definitions/deadline.pyclassDeadlineReference:"""The public interface class for all DeadlineReference options."""# 预定义实例:DAG Run 逻辑日期作为参考点DAGRUN_LOGICAL_DATE:DeadlineReferenceType=DagRunLogicalDateDeadline()# 预定义实例:DAG Run 入队时间作为参考点DAGRUN_QUEUED_AT:DeadlineReferenceType=DagRunQueuedAtDeadline()@classmethoddefAVERAGE_RUNTIME(cls,max_runs:int=0,min_runs:int|None=None)-DeadlineReferenceType:"""基于历史平均运行时间"""ifmax_runs==0:max_runs=AverageRuntimeDeadline.DEFAULT_LIMIT# 默认10次ifmin_runsisNone:min_runs=max_runsreturnAverageRuntimeDeadline(max_runs,min_runs)@classmethoddefFIXED_DATETIME(cls,dt:datetime)-DeadlineReferenceType:"""固定时间点"""returnFixedDatetimeDeadline(dt)TYPES 分类系统:classTYPES:"""Collection of DeadlineReference types for type checking."""# DAG Run 创建时就计算截止时间的类型DAGRUN_CREATED:DeadlineReferenceTypes=(DagRunLogicalDateDeadline,FixedDatetimeDeadline,AverageRuntimeDeadline,)# DAG Run 入队时才计算截止时间的类型DAGRUN_QUEUED:DeadlineReferenceTypes=(DagRunQueuedAtDeadline,)# 所有 DAG Run 相关类型的合集DAGRUN:DeadlineReferenceTypes=DAGRUN_CREATED+DAGRUN_QUEUED这个分类决定了 Deadline 在 DAG Run 生命周期的哪个阶段被创建:DAGRUN_CREATED:DAG Run 创建时立即计算并创建 Deadline(此时logical_date已知)DAGRUN_QUEUED:DAG Run 进入队列时才创建(此时queued_at才确定)2.3 Callback 定义回调系统定义在task-sdk/src/airflow/sdk/definitions/callback.py:# 源码位置:task-sdk/src/airflow/sdk/definitions/callback.pyclassCallback(ABC):""" Base class for Deadline Alert callbacks. Callbacks are used to execute custom logic when a deadline is missed. """path:str# 回调函数的导入路径kwargs:dict# 传递给回调的额外参数def__init__(self,callback_callable:Callable|str,kwargs:dict[str,Any]|None=None):self.path=self.get_callback_path(callback_callable)ifkwargsand"context"inkwargs:raiseValueError("context is a reserved kwarg for this class")self.kwargs=kwargsor{}@classmethoddefget_callback_path(cls,_callback:str|Callable)-str:"""Convert callback to a string path that can be used to import it later."""ifcallable(_callback):cls.verify_callable(_callback)returnf"{_callback.__module__}.{_callback.__qualname__}"# 字符串形式的 dotpathifnotisinstance(_callback,str)ornotis_valid_dotpath(_callback.strip()):raiseImportError(f"`{_callback}` doesn't look like a valid dot path.")return_callback.strip()classAsyncCallback(Callback):"""Asynchronous callback that runs in the triggerer."""@classmethoddefverify_callable(cls,callback:Callable):ifnot(inspect.iscoroutinefunction(callback)orhasattr(callback,"__await__")):raiseAttributeError(f"Provided callback{callback}is not awaitable.")classSyncCallback(Callback):"""Synchronous callback that runs in the specified or default executor."""executor:str|Nonedef__init__(self,callback_callable,kwargs=None,executor:str|None=None):super().__init__(callback_callable=callback_callable,kwargs=kwargs)self.executor=executor两种回调的运行位置:类型运行位置适用场景AsyncCallbackTriggerer 进程发送 HTTP 请求、调用外部 API、非阻塞通知SyncCallbackExecutor(默认或指定)执行耗时操作、需要特定环境的回调3. 核心模型层:Deadline 与 DeadlineAlert3.1 DeadlineAlert 持久化模型当 DAG 被序列化时,DeadlineAlert配置被保存到数据库:# 源码位置:airflow-core/src/airflow/models/deadline_alert.pyclassDeadlineAlert(Base):"""Table containing DeadlineAlert properties."""__tablename__="deadline_alert"id:Mapped[UUID]=mapped_column(Uuid(),primary_key=True,default=uuid6.uuid7)created_at:Mapped[datetime]=mapped_column(UtcDateTime,nullable=False,default=timezone.utcnow)# 关联到序列化的 DAGserialized_dag_id:Mapped[UUID]=mapped_column(Uuid(),ForeignKey("serialized_dag.id",ondelete="CASCADE"),nullable=False)# 告警元数据name:Mapped[str|None]=mapped_column(String(250),nullable=True)description:Mapped[str|None]=mapped_column(Text,nullable=True)# 核心配置(JSON 存储)reference:Mapped[dict]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2604237.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…