调度模型与分类:批处理、流式、实时、离线
做调度系统这些年,我见过不少团队一上来就选型,结果跑了两周发现模型不对,推倒重来。说白了,调度模型没有银弹,选错了就是给自己挖坑。
今天咱们把四种主流调度模型掰开揉碎讲清楚。批处理、流式、实时、离线——它们各自长什么样?适合什么场景?我踩过哪些坑?
一、批处理调度(Batch Scheduling)
批处理,最经典也最“老实”的调度模型。它的核心逻辑是:攒一批任务,集中处理。
举个例子,你每天凌晨跑一次数据报表。把一天的所有订单数据汇总,跑个ETL,生成报表。这就是典型的批处理。
核心特征:
- 任务有明确的开始和结束
- 处理的是“有界数据”(数据量已知)
- 延迟较高,分钟级到小时级
- 吞吐量大,适合海量数据
我在项目中遇到过最典型的批处理场景——金融系统的日终清算。每天晚上10点,所有交易数据落地,然后启动一批清算任务。任务之间有依赖关系:先对账,再清算,最后生成报表。我用DAG(有向无环图)来编排这些任务,一个节点挂了,下游自动等待。
我的习惯:批处理调度一定要做好“断点续传”。我曾经因为没做这个,一个跑了6小时的批任务在5小时59分挂了,第二天全量重跑……那滋味,你懂的。
二、流式调度(Streaming Scheduling)
流式调度,说白了就是“来一条处理一条”。数据源源不断,任务永远不结束。
你想想看,实时监控系统、日志采集管道、推荐系统的实时特征计算——这些都是流式调度的地盘。
| 维度 | 批处理 | 流式调度 |
|---|---|---|
| 数据 | 有界 | 无界 |
| 延迟 | 高(分钟~小时) | 低(毫秒~秒) |
| 任务生命周期 | 有始有终 | 常驻运行 |
| 典型框架 | MapReduce、Spark Batch | Flink、Kafka Streams |
流式调度有个大坑——状态管理。我记得有一次做实时风控,流任务跑了三天,状态越积越大,最后OOM了。后来我改用Flink的RocksDB状态后端,才稳住。
注意:流式调度不是“实时调度”。很多人把这两个混为一谈。流式强调的是“持续处理”,实时强调的是“响应时间”。后面会细讲。
三、实时调度(Real-time Scheduling)
实时调度,核心就一个字:快。
它要求任务在严格的时间窗口内完成。比如证券交易系统,订单必须在10毫秒内完成撮合。超时就废了。
实时调度和流式调度的区别在哪?我打个比方:
- 流式调度:像流水线,零件一个一个过来,工人一个一个处理
- 实时调度:像急诊室,病人来了必须马上处理,超过黄金时间就危险了
实时调度对调度器的要求极高:
- 抢占式调度:高优先级任务可以打断低优先级任务
- 确定性延迟:调度延迟必须是可预测的,不能忽高忽低
- 资源预留:关键任务要提前锁定资源
我曾经在物联网项目中做过一个实时调度系统,控制工业机器人的动作。调度延迟超过50毫秒,机器人就会抖动。嗯,那段时间我做梦都在调调度参数。
四、离线调度(Offline Scheduling)
离线调度,很多人觉得它和批处理是一回事。其实不然。
批处理强调的是“处理方式”——攒一批再干。
离线调度强调的是“数据来源”——数据不是实时产生的,而是已经落地的历史数据。
举个例子:
- 你每天跑一次用户画像更新,这是批处理
- 你用上周的日志数据训练一个推荐模型,这是离线调度
离线调度通常用于:
- 模型训练(数据已经准备好,不着急出结果)
- 历史数据分析(查昨天的、上周的、去年的数据)
- 数据备份与归档
避坑指南:离线调度最容易忽略的是“数据一致性”。我曾经调度一个离线训练任务,上游数据还没写完,下游训练任务就启动了,结果模型学了一堆脏数据。后来我强制加了数据就绪检查——任务启动前先确认上游数据的分区数、记录数是否达标。
五、四种模型的对比与选择
说了这么多,到底怎么选?我画了一张图,帮你理清思路:
选型时我一般问自己三个问题:
- 数据是有界的还是无界的?——有界走批处理/离线,无界走流式/实时
- 延迟要求多高?——毫秒级必须上实时调度,秒级到分钟级流式就够了
- 数据是历史数据还是实时数据?——历史数据用离线,实时数据用流式
我的经验:很多系统其实是混合的。比如一个推荐系统,模型训练用离线调度(每天跑一次),特征计算用流式调度(实时更新用户特征),线上服务用实时调度(毫秒级返回推荐结果)。三种模型共存,各司其职。
六、小结
四种调度模型,没有谁比谁高级。批处理简单可靠,流式灵活实时,实时调度要求苛刻,离线调度适合“不着急”的场景。
选型的关键,是搞清楚你的业务到底要什么。延迟、吞吐量、数据特征——这三个维度想清楚了,模型自然就出来了。
嗯,调度模型这块就先聊到这儿。下一节咱们聊聊调度系统的核心架构设计,到时候我会把我在生产环境中踩过的那些坑,一个一个讲给你听。
想要更多资料,联系可可