当前位置: 首页 > article >正文

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

导读(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]

相关文章:

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

导读(Introduction) 在生产环境中运行的数据管道,"按时完成"往往和"正确完成"同样重要。当一个关键的每日报表管道必须在早上 8 点前完成,或者当一个下游系统依赖的数据必须在特定时间窗口内准备就绪时,仅仅依靠"失败后告警"是不够的——我…...

别再死记硬背了!Vivado伪双口RAM的wea/ena信号,这次用仿真波形给你讲透

深入解析Vivado伪双口RAM控制信号:从波形图看wea/ena关键设计 在FPGA开发中,存储器设计一直是性能优化的关键环节。Xilinx Vivado工具链提供的伪双口RAM IP核因其灵活性和高效性,成为许多高速数据处理系统的首选方案。然而,不少开…...

从源码细节看muduo为何比libevent2快70%:一次4096字节读取限制引发的性能思考

从缓冲区设计揭秘高性能网络库的优化哲学 在构建高并发服务器时,网络库的性能差异往往源于看似微小的设计决策。当两个知名网络库在相同硬件条件下出现70%的吞吐量差距时,这个数字背后隐藏的是对系统调用、内存管理和数据流控制的深刻理解差异。本文将从…...

Apache Airflow 系列教程 | 第28课:Backfill 与数据回填策略

导读(Introduction) 欢迎来到 Apache Airflow 源码深度解析系列的第二十八课。 在数据工程的日常工作中,“回填”(Backfill)是一个高频操作。当你修复了一个数据转换逻辑的 bug、新增了一个数据列的计算、或者需要重新处理因上游系统故障导致的历史缺失数据时,你需要让…...

SAP供应商创建后,BP界面贸易伙伴字段不显示?手把手教你用FS_API_BP001_CHANGE补传数据

SAP供应商创建后BP界面贸易伙伴字段不显示的解决方案 在SAP系统中创建供应商时,经常会遇到一个令人困惑的问题:明明已经通过标准BAPI(如vmd_ei_api)将贸易伙伴信息成功写入数据库表LFA1的VBUND字段,但在业务伙伴(BP)界…...

门电路的电气特性详解

门电路的电气特性详解 深入理解门电路的电气参数,是设计可靠数字系统的必备知识。 🎯 本章学习要点 理解输入/输出电压阈值参数掌握扇入扇出的概念和计算了解传输延迟对电路的影响理解功耗来源及优化策略 1️⃣ 输入输出特性参数 1.1 电压阈值参数 &a…...

如何彻底解决Windows风扇控制难题:Fan Control完整指南

如何彻底解决Windows风扇控制难题:Fan Control完整指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/f…...

手把手复现1G通话:用Python模拟FM调制、FSK信令与FDMA多用户通信

手把手复现1G通话:用Python模拟FM调制、FSK信令与FDMA多用户通信 在移动通信的演进史中,1G系统如同数字时代的罗塞塔石碑,用模拟信号承载了人类首次无线对话的自由。今天我们将穿越回1983年摩托罗拉DynaTAC 8000X面世的年代,用Py…...

高级技巧:利用SharpShooter实现COM Staging和应用程序白名单绕过

高级技巧:利用SharpShooter实现COM Staging和应用程序白名单绕过 【免费下载链接】SharpShooter Payload Generation Framework 项目地址: https://gitcode.com/gh_mirrors/sh/SharpShooter SharpShooter 是一款功能强大的Payload生成框架,专为安…...

告别激活烦恼:KMS_VL_ALL_AIO智能激活脚本的终极解决方案

告别激活烦恼:KMS_VL_ALL_AIO智能激活脚本的终极解决方案 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 你是否曾经为Windows系统激活而烦恼?或者为Office办公软件的激活…...

Gridfinity Rebuilt OpenSCAD优化技巧:节省材料、提升打印质量的7个方法

Gridfinity Rebuilt OpenSCAD优化技巧:节省材料、提升打印质量的7个方法 【免费下载链接】gridfinity-rebuilt-openscad A ground-up rebuild of the stock gridfinity bins in OpenSCAD 项目地址: https://gitcode.com/gh_mirrors/gr/gridfinity-rebuilt-opensca…...

如何轻松解密Widevine加密视频:完整免费指南

如何轻松解密Widevine加密视频:完整免费指南 【免费下载链接】video_decrypter Decrypt video from a streaming site with MPEG-DASH Widevine DRM encryption. 项目地址: https://gitcode.com/gh_mirrors/vi/video_decrypter 还在为付费视频无法离线保存而…...

如何3步解决网页数学公式复制到Word的世纪难题?

如何3步解决网页数学公式复制到Word的世纪难题? 【免费下载链接】LaTeX2Word-Equation Copy LaTeX Equations as Word Equations, a Chrome Extension 项目地址: https://gitcode.com/gh_mirrors/la/LaTeX2Word-Equation 你是否曾为了将维基百科、学术论文或…...

Verilog分频器进阶:从6分频到1.5分频的实战设计与波形分析

1. 分频器基础与设计思路 在数字电路设计中,时钟信号就像人的心跳一样重要。分频器的作用,就是把这个"心跳"调整到我们需要的节奏。简单来说,分频器就是把输入时钟的频率降低N倍,得到一个新的时钟信号。比如6分频&#…...

MTCNN级联网络设计精讲:从P-Net到O-Net,看作者如何用‘奇数特征图’和‘重叠池化’提升召回率

MTCNN级联网络架构解密:奇数特征图与重叠池化的工程智慧 人脸检测领域的技术演进始终围绕着两个核心命题:如何在有限计算资源下实现实时检测,以及如何在小目标场景中保持高召回率。2016年问世的MTCNN(Multi-task Cascaded Convol…...

vue3-vant-mobile项目部署指南:Netlify零配置发布终极教程

vue3-vant-mobile项目部署指南:Netlify零配置发布终极教程 【免费下载链接】vue3-vant-mobile An mobile web apps template based on the Vue 3 ecosystem。一个基于 Vue 3 生态系统的移动 web 应用模板,帮助你快速完成业务开发。 项目地址: https://…...

对比 Codex 和 Claude Code

要在使用千问或 DeepSeek 等国产模型的前提下,对比 Codex 和 Claude Code,这已经不是一个简单的“二选一”问题,而是一个关于聪明“组合”的选题。虽然它们的设计理念差别很大,但在国产大模型强大的适配能力和高性价比面前&#x…...

告别杂乱地图标注!Arcgis中标注位置与多边形中心点提取的‘黄金搭档’技巧

告别杂乱地图标注!Arcgis中标注位置与多边形中心点提取的‘黄金搭档’技巧 当你在制作行政区划图或设施分布图时,是否曾被密密麻麻的标注搞得焦头烂额?标注重叠、位置不当、中心点偏移——这些问题不仅影响地图美观,更会降低信息的…...

从零开始:sherpa-onnx跨平台语音识别终极指南

从零开始:sherpa-onnx跨平台语音识别终极指南 【免费下载链接】sherpa-onnx Speech-to-text, text-to-speech, speaker diarization, speech enhancement, source separation, and VAD using next-gen Kaldi with onnxruntime without Internet connection. Support…...

小白程序员也能抓住的AI高薪机遇:大模型时代的机会与挑战

某书成立AI一级部门,预示着AI成为大厂核心战略。AI已从噱头渗透到工作和生活中,带来高薪机遇。AI大模型应用开发工程师年薪可达70万,薪资高源于需求大、供给少。无论技术岗还是非技术岗,AI都将创造更多机会。普通人应主动学习AI工…...

CANN/asc-devkit bfloat16转half API

__bfloat162half_ru 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https://git…...

MySQL 基础:SELECT、WHERE、JOIN 的第一次使用

不用怕数据库,跟着这三个单词,你就能查到你想要的一切。欢迎来到 《大一突围》 专栏。很多大一同学第一次接触 MySQL,看到“数据库”三个字就觉得很难。其实,你日常生活中每天都在“查数据”——查成绩、翻通讯录、筛选淘宝商品……...

HEIF Utility:Windows平台HEIF格式兼容性完整解决方案实战

HEIF Utility:Windows平台HEIF格式兼容性完整解决方案实战 【免费下载链接】HEIF-Utility HEIF Utility - View/Convert Apple HEIF images on Windows. 项目地址: https://gitcode.com/gh_mirrors/he/HEIF-Utility 对于使用iPhone或iPad的Windows用户而言&a…...

Notero:终极Zotero与Notion同步插件,简单快速实现文献管理一体化

Notero:终极Zotero与Notion同步插件,简单快速实现文献管理一体化 【免费下载链接】notero A Zotero plugin for syncing items and notes into Notion 项目地址: https://gitcode.com/gh_mirrors/no/notero 你是否正在为文献管理与笔记整理之间的…...

别再死记硬背了!用这三个等效模型,轻松搞定二极管电路分析(附典型例题)

二极管电路分析的三大等效模型实战指南 在电子工程和嵌入式开发领域,二极管作为基础元件却常常成为初学者的"拦路虎"。面对复杂的二极管电路,很多人陷入死记硬背的困境——记住各种电路的输出结果,却无法理解背后的分析逻辑。这种学…...

Pixelle-Video深度解析:AI全自动短视频引擎,一句话生成专业级短视频

https://github.com/AIDC-AI/Pixelle-Videohttps://github.com/AIDC-AI/Pixelle-Video 引言 刷到一条短视频,画面精美、配乐到位、解说流畅——你以为这至少得花两小时剪出来?其实可能只花了一句话的时间。今天我们要深入介绍的,就是GitHub…...

5分钟解锁浏览器Markdown阅读新体验:告别文档查看烦恼

5分钟解锁浏览器Markdown阅读新体验:告别文档查看烦恼 【免费下载链接】markdown-viewer Markdown Viewer / Browser Extension 项目地址: https://gitcode.com/gh_mirrors/ma/markdown-viewer 你是否经常需要查看技术文档、API说明或学习笔记,却…...

从无人机到平衡车:MPU6050姿态融合(互补滤波)的实战调参指南与避坑心得

从无人机到平衡车:MPU6050姿态融合实战调参与避坑指南 姿态解算在无人机飞控、平衡车和机器人系统中扮演着核心角色。MPU6050作为一款集成了三轴陀螺仪和三轴加速度计的惯性测量单元(IMU),其数据融合质量直接决定了系统稳定性。许多开发者虽然理解了互补…...

轻量级内存清理神器Mem Reduct:如何让旧电脑重获新生?[特殊字符]

轻量级内存清理神器Mem Reduct:如何让旧电脑重获新生?😊 【免费下载链接】memreduct Lightweight real-time memory management application to monitor and clean system memory on your computer. 项目地址: https://gitcode.com/gh_mirr…...

从通信原理到Verilog:一个约束长度7的卷积码编码器是如何炼成的?

从通信原理到Verilog:一个约束长度7的卷积码编码器是如何炼成的? 在数字通信系统的设计中,纠错编码技术如同隐形的守护者,确保数据在嘈杂信道中可靠传输。卷积码因其优异的纠错性能和简洁的编码结构,成为卫星通信、深空…...