2、实时计算基础:流处理概念、事件时间与处理时间、水位线机制、Exactly-Once语义
大家好,我是老张。今天咱们聊聊实时计算的基础。说实话,很多做数据湖的同学一听到「流处理」就头大,觉得那是实时数仓的事。但金融场景里,数据湖和实时流处理早就分不开了——你想想看,交易监控、风控预警、实时报表,哪个离得开流?
2.1 流处理的核心概念
流处理,说白了就是「数据来了就处理」,不等不靠。跟批处理那种「攒一批再算」完全不同。
我刚开始接触流处理时,总觉得它跟批处理差不多,无非是快一点。后来踩了坑才明白——流处理的核心是「无限数据」和「持续计算」。数据源源不断,计算永不停歇。
流处理的三个关键特征:
- 无界数据:数据没有终点,永远在来
- 低延迟:毫秒级响应,不是分钟级
- 状态管理:需要记住中间结果
举个例子。你在做交易流水统计,批处理是每天凌晨跑一次,算昨天的数据。流处理呢?每来一笔交易,实时更新统计结果。嗯,这里要注意——流处理不是简单的「快」,而是「持续」。
2.2 事件时间 vs 处理时间
这是流处理里最容易搞混的概念。我见过不少团队,一开始都用处理时间,结果数据对不上账,查了半天才发现是时间语义的问题。
| 概念 | 定义 | 特点 | 典型问题 |
|---|---|---|---|
| 事件时间 | 数据实际发生的时间 | 真实、不可变 | 数据可能乱序到达 |
| 处理时间 | 数据到达处理系统的时间 | 简单、易实现 | 受系统负载影响 |
事件时间,就是交易真正发生的时间戳。比如用户下单是 10:00:00,但网络延迟,系统 10:00:05 才收到。事件时间还是 10:00:00。
处理时间,就是系统收到数据的时间。还是那个例子,处理时间就是 10:00:05。
为什么说这个重要?我曾在项目中遇到一个坑——用处理时间做窗口统计,结果系统突然卡了一下,所有窗口都偏移了。后来改成事件时间,问题才解决。
我的建议:金融场景里,尽量用事件时间。交易时间、日志时间这些,都是业务真实时间,不能因为系统延迟就扭曲了。
2.3 水位线机制
水位线,英文叫 Watermark。这名字挺抽象,我换个说法——水位线就是「我等到什么时候就不再等了」。
你想想看,流处理里数据是乱序的。事件时间 10:00:00 的数据,可能 10:00:10 才到。那窗口什么时候关闭?等多久?
水位线就是干这个的。它告诉系统:「到目前为止,事件时间小于等于 X 的数据,应该都到了。没到的,就当丢了。」
水位线的核心逻辑:
- 水位线 = 当前观察到的事件时间 - 允许的延迟
- 水位线到达窗口结束时间 → 触发窗口计算
- 水位线之后到的数据 → 算迟到数据,可以单独处理
举个例子。你设置窗口为 1 分钟,允许延迟 10 秒。系统收到事件时间 10:00:00 的数据,水位线就是 09:59:50。收到 10:00:05 的数据,水位线变成 09:59:55。当水位线超过 10:00:00 时,窗口触发计算。
我曾经在实时风控项目里,水位线设得太激进,结果大量数据被当成迟到数据,风控规则漏掉了不少交易。后来调大了允许延迟,才稳定下来。
注意:水位线不是万能的。如果数据延迟太大,水位线设得太大,窗口迟迟不触发,实时性就没了。这是个 trade-off,需要根据业务场景调优。
2.4 Exactly-Once 语义
Exactly-Once,中文叫「精确一次」。意思是每条数据只处理一次,不多不少。
流处理里,数据可能重复发送,系统可能崩溃重启。如果没有 Exactly-Once,结果就会出错——要么重复计算,要么漏算。
实现 Exactly-Once 需要三个层面的配合:
- 源头端:数据源支持重放,比如 Kafka 的 offset 机制
- 计算端:状态存储支持事务,比如 Flink 的 checkpoint
- 输出端:写入支持幂等或事务,比如两阶段提交
Flink 的 Exactly-Once 实现:
- Barrier 机制:在数据流中插入 checkpoint 标记
- 状态快照:将算子状态持久化到外部存储
- 故障恢复:从最近的 checkpoint 恢复,重新处理数据
我记得有一次,系统因为网络抖动导致重复消费,结果交易统计翻了一倍。排查了半天,发现是 Exactly-Once 没配好,输出端没有做幂等处理。从那以后,我每次上线都会检查三个端点的 Exactly-Once 配置。
避坑指南:我曾经以为只要计算端配了 Exactly-Once 就万事大吉。后来发现,输出端如果没做幂等,数据还是会重复。记住——Exactly-Once 是端到端的,不是单点的。
2.5 知识体系总览
说了这么多,咱们用一张图把核心逻辑串起来。
这张图把咱们今天讲的内容串起来了。流处理概念是基础,时间语义是核心,水位线是保障,Exactly-Once 是底线。四者缺一不可。
好了,今天就聊到这儿。这些概念看着简单,真正用起来坑不少。我建议你找个 Flink 环境,亲手跑几个例子,感受一下事件时间和水位线的配合。实践出真知嘛。
公众号:蓝海资料掘金营,微信deep3321