一、调度系统概述:实时调度与离线调度的定义、区别与联系

各位同学好,我是老赵。今天咱们正式开讲《实时与离线调度任务混合编排实战》的第一章。

调度系统,说白了就是「谁在什么时候干什么活」的一套机制。你想想看,一个稍微复杂点的业务系统,背后少说几十个任务在跑。有的任务必须秒级响应,有的任务拖到半夜跑完就行。这两种任务放在一起,怎么管?这就是咱们这门课要解决的核心问题。

我个人习惯先把概念掰扯清楚,再动手。所以这一章,咱们先把实时调度和离线调度的定义、区别、联系,以及混合编排的应用场景,一个一个说透。

1.1 什么是实时调度?

实时调度,指的是任务必须在严格的时间约束内完成。超时了,就算失败。

举个例子:你在电商平台下单,系统需要立刻扣减库存、生成订单、推送消息给仓库。这个流程如果超过 3 秒,用户可能就关页面了。更极端的场景——股票交易系统,订单撮合延迟超过 10 毫秒,可能就亏钱了。

我在项目中遇到过最典型的实时调度场景,是物联网设备的告警处理。设备上报温度异常,系统必须在 500 毫秒内触发告警并通知运维人员。晚一秒,设备可能就烧了。

实时调度的核心特征:
  • 时间约束严格:Deadline 是硬指标
  • 任务优先级明确:高优先级任务抢占资源
  • 响应时间可预测:不能有大幅抖动
  • 失败处理即时:超时立刻告警或降级

1.2 什么是离线调度?

离线调度,任务没有严格的实时性要求。你只要在某个时间窗口内跑完就行,早一点晚一点问题不大。

最常见的例子就是大数据平台的 ETL 任务。每天凌晨 2 点,把昨天的业务数据从 MySQL 同步到 Hive,然后跑一堆清洗、聚合、统计的脚本。早上 8 点前出报表就行。跑得快,3 点完事;跑得慢,6 点完事,都行。

我记得刚入行那会儿,公司有个离线调度系统,每天夜里跑几百个数据同步任务。有一次某个任务卡住了,导致后续任务全部排队。结果第二天早上报表没出来,业务部门追着问。后来我加了个「任务依赖超时告警」,才算消停。

离线调度的核心特征:
  • 时间约束宽松:通常以小时/天为单位
  • 任务依赖复杂:DAG(有向无环图)是常见模型
  • 资源利用率高:可以批量执行、错峰运行
  • 重试机制友好:失败了等会儿重跑就行

1.3 实时调度 vs 离线调度:一张表说清楚

很多同学容易把这两个概念搞混。我直接列个对比表,你一看就明白。

对比维度 实时调度 离线调度
时间约束 毫秒/秒级,超时即失败 分钟/小时级,允许延迟
任务触发 事件驱动(消息、API 调用) 时间驱动(Cron 表达式、定时触发)
资源分配 预留资源,抢占式 共享资源,排队执行
失败处理 降级、熔断、快速失败 重试、跳过、人工介入
典型场景 交易系统、告警处理、实时风控 ETL、报表生成、数据同步
调度引擎 Akka、Storm、Flink Airflow、DolphinScheduler、Oozie

你看,这两者从触发方式到失败处理,完全是两套逻辑。但现实系统中,它们往往共存。

1.4 实时与离线的联系:不是非此即彼

有人觉得实时和离线是水火不容的。其实不是。它们之间有很多联系。

第一,数据流是连续的。 实时任务处理的是「当前时刻」的数据,离线任务处理的是「历史时段」的数据。但数据本身是同一个来源。比如用户点击行为,实时任务用来做推荐,离线任务用来做用户画像分析。

第二,离线任务依赖实时任务的产出。 我做过一个项目,实时任务把清洗后的数据写入 Kafka,离线任务每天凌晨从 Kafka 拉取数据做批量聚合。没有实时任务的预处理,离线任务根本跑不起来。

第三,实时任务需要离线任务的模型支撑。 比如实时风控系统,它用的规则模型是离线任务每天凌晨训练好、推送到线上的。没有离线训练的模型,实时判断就是瞎猜。

我曾经踩过的坑: 有个项目把实时和离线完全割裂,两套团队、两套技术栈、两套数据源。结果实时任务和离线任务算出来的指标对不上,业务方天天吵架。后来我们统一了数据源和元数据管理,才算解决。所以,实时和离线不是孤岛,必须打通。

1.5 混合编排的应用场景

讲完了概念,咱们聊聊实际场景。混合编排,就是把实时任务和离线任务放在同一个调度系统里统一管理。为什么要这么做?

场景一:实时数据入湖 + 离线批量分析

实时任务把业务数据流式写入数据湖(比如 Delta Lake、Iceberg),离线任务每天凌晨对湖里的数据做全量校验、分区合并、历史回溯。两个任务共享同一个数据源和调度平台,避免数据口径不一致。

场景二:在线推理 + 离线模型训练

实时任务负责在线推理(比如推荐、风控),离线任务负责模型训练和评估。训练完成后,离线任务自动触发模型上线,实时任务热加载新模型。整个流程在一个调度系统里编排,省去人工干预。

场景三:实时告警 + 离线根因分析

实时任务监控系统指标,触发告警后,自动拉起一个离线分析任务,去查历史日志、做根因定位。告警和分析是联动的,但一个是实时响应,一个是离线计算。混合编排让这个联动变得自然。

场景四:实时流处理 + 离线回溯修正

实时流处理难免有数据延迟或乱序。离线任务可以在第二天对前一天的数据做回溯修正,把修正结果写回在线存储。实时任务读取修正后的数据,保证最终一致性。

我的建议: 混合编排不是把实时和离线硬塞到一起。核心是找到它们之间的「衔接点」——数据依赖、触发条件、结果反馈。把这些衔接点设计清楚,混合编排才能发挥价值。

1.6 本章知识体系总览

说了这么多,咱们用一张图把本章的知识结构串起来。这张图是我自己画的,你一看就能理解实时调度、离线调度和混合编排的关系。

实时调度与离线调度知识体系 调度系统知识体系总览 实时调度 离线调度 核心特征 • 毫秒/秒级响应 • 事件驱动触发 • 抢占式资源分配 • 降级/熔断处理 核心特征 • 分钟/小时级响应 • 时间驱动触发 • 共享资源排队 • 重试/人工介入 联系与衔接 数据流连续 离线依赖实时产出 实时依赖离线模型 统一元数据管理 混合编排(统一调度平台) 实时入湖 + 离线分析 在线推理 + 离线训练 实时告警 + 根因分析 流处理 + 回溯修正

这张图把咱们这一章的核心内容都串起来了。从上往下看:实时调度和离线调度各有各的特征,中间通过数据流、依赖关系、模型支撑等衔接点联系起来,最终汇聚到混合编排这个统一调度平台上,支撑四大典型应用场景。