核心概念:数据流、时间、水位线与窗口
好,咱们正式开始啃实时流处理的核心概念。说实话,这部分是很多人的分水岭——搞懂了,后面架构设计就是一马平川;搞不懂,看啥都像一团乱麻。我个人习惯把这四个概念串成一条线来讲,因为它们谁也离不开谁。
数据流(DataStream)—— 永不停歇的河流
数据流是什么?说白了,就是一条有起点、没终点的数据序列。跟批处理那种“今天处理昨天的数据”完全不同,流处理是“数据一来,立刻处理”。
我在项目中遇到过最典型的场景:用户点击日志从几十万台手机源源不断地涌进来。你没法等所有数据到齐再动手——因为永远到不齐。这就是流的本质。
数据流的三个关键特征:
- 无界(Unbounded):理论上数据会持续产生,没有尽头
- 有序性(Ordering):在单个分区内通常有序,跨分区则不一定
- 不可变性(Immutable):数据一旦产生,就不会被修改
你想想看,如果数据流是一条河,那批处理就是拿桶去河边打水,打完一桶再打下一桶。而流处理呢?是直接在河里装了个过滤器,水过即滤。
事件时间 vs 处理时间 —— 两个时钟的博弈
这是新手最容易踩坑的地方。我刚开始做流处理时,也天真地以为“时间就是时间”,直到被乱序数据狠狠教育了一回。
| 概念 | 定义 | 典型问题 |
|---|---|---|
| 事件时间(Event Time) | 数据实际发生的时间戳,由业务系统生成 | 乱序、延迟到达 |
| 处理时间(Processing Time) | 数据到达处理引擎的系统时钟 | 结果随机器负载波动 |
举个例子:用户在 14:00 下单,但网络卡顿,日志 14:05 才到服务器。事件时间是 14:00,处理时间是 14:05。如果你按处理时间算,这笔订单就被归到了 14:05 的窗口里——结果完全错了。
我曾经踩过的坑: 有个实时大屏项目,直接用处理时间做统计。结果凌晨业务低谷时,数据延迟 30 秒才到,大屏上的“实时”数据跟实际差了整整一个窗口。从那以后,我所有核心业务都强制使用事件时间。
那是不是处理时间就没用了?也不是。监控、告警、简单聚合这些对精度要求不高的场景,处理时间反而更简单、延迟更低。关键是要分场景选对。
水位线(Watermark)—— 流处理的时间裁判
好,问题来了:既然用事件时间,那怎么知道“数据到齐了”?
答案是:你永远不知道。但水位线可以告诉你“差不多到齐了”。
水位线本质上是一个时间戳断言:它告诉引擎,“在这个时间点之前的数据,大概率已经全部到达了”。
我的经验: 水位线不是精确的,它是工程上的妥协。你设 5 秒延迟,就容忍 5 秒内的乱序;设 30 秒,容忍度更高但结果出得更慢。没有银弹,只有权衡。
水位线的生成策略通常有两种:
- 周期性水位线(Periodic):每隔 N 毫秒生成一次,取当前观察到的最小事件时间减去延迟阈值
- 标点水位线(Punctuated):数据流中遇到特殊标记时触发,适合有明确边界的数据源
嗯,这里要注意:水位线是单调递增的。如果新来的数据事件时间比当前水位线还小,那它就被判定为“迟到数据”——要么丢弃,要么走侧输出流单独处理。
窗口(Window)—— 把无界流切成有界块
数据流是无界的,但计算需要边界。窗口就是那个“切刀”。
常见的窗口类型,我整理了一张表:
| 窗口类型 | 说明 | 适用场景 |
|---|---|---|
| 滚动窗口(Tumbling) | 固定大小,不重叠。如每 5 分钟一个窗口 | 按时间切分的统计报表 |
| 滑动窗口(Sliding) | 固定大小,可重叠。如窗口 10 分钟,滑动 5 分钟 | 平滑曲线、移动平均 |
| 会话窗口(Session) | 根据活动间隙切分,无固定长度 | 用户行为分析、点击流 |
| 全局窗口(Global) | 整个数据流一个窗口,需配合触发器 | 自定义分组逻辑 |
窗口的触发时机,跟水位线紧密相关。比如一个 5 分钟的滚动窗口 [14:00, 14:05),当水位线推进到 14:05 时,引擎就知道“这个窗口的数据基本到齐了”,于是触发计算。
核心公式(记住这个):
窗口触发条件 = 当前水位线 >= 窗口结束时间
水位线没到,窗口就一直等着。这就是为什么水位线设置太大会导致结果延迟,太小又会导致数据丢失。
四者关系全景图
说了这么多,咱们用一张图把关系理清楚:
这张图我建议你存下来。每次做架构设计时,问自己三个问题:
- 我的数据源能提供可靠的事件时间吗?
- 我能容忍多大的乱序延迟?
- 窗口触发后,迟到的数据怎么处理?
一个小技巧: 刚开始做流处理时,可以把水位线延迟设得宽松一些(比如 30 秒),等业务稳定了再逐步收紧。我曾经有个项目,一开始设 5 秒延迟,结果每天丢 3% 的数据,后来改成 20 秒,数据完整了,延迟也完全可接受。
好了,这四个概念就像流处理的四根柱子。数据流是原料,事件时间和处理时间是两种度量尺度,水位线是裁判,窗口是加工车间。搞懂它们之间的关系,后面学状态管理、容错机制、精确一次语义,都会轻松很多。