流处理是一种以连续数据流为核心的数据处理范式,强调对"实时产生、实时传递、实时计算"的数据进行持续响应。它不仅是一种计算模型,也是一种用于构建实时应用、实时分析系统、实时数据集成平台的架构方法论。
本篇文档从本质模型、关键概念、设计模式、时间语义、容错模型到 Streaming SQL 与流表关系进行系统性升维整理,为理解现代流式系统(Kafka Stream / Flink / Beam / Spark Streaming)的统一认知框架提供参考。
流处理从根本上解决的是以下问题:
如何处理无界数据(Unbounded Data)? 即永不停止增长的数据序列。
如何保持系统在时间上的一致性与准确性? 包含事件时间、乱序处理、水位线、触发器、延迟处理等。
如何管理跨时间演化的状态? 包含本地状态、长久状态、快照、回放、容错机制等。
如何让计算逻辑在分布式环境下具备可恢复性、可扩展性与精确一次性语义?
如何抽象流与表之间的关系? 包含 CDC、事件溯源、流表双向转换、流式 Join 等。
流处理本质上是一种 “带状态的事件驱动系统”,在无限事件流上做有限时间窗内的滑动计算,并具备可恢复、可重复、可重放的能力。
流处理的典型能力可归纳为三类:
根据定义好的事件模式检测数据流中是否发生模式事件(如“连续三次失败登录”)。本质是对事件序列进行实时图灵识别。
在时间窗口内执行聚合计算,如 5 秒平均、10 分钟 UV、1 小时滑动累计等。
使用流作为通信方式,实现持续响应的交互模式,如“观察模式”“增量更新模式”“实时订阅”。
早期流处理常通过 MQ 级联方式实现:
stateDiagram
direction LR
数据源 --> 消息队列1
消息队列1 --> 处理逻辑1
处理逻辑1 --> 消息队列2
消息队列2 --> 处理逻辑3
消息队列2 --> 处理逻辑4
处理逻辑3 --> 消息队列3
处理逻辑4 --> 消息队列3
传统 MQ 存在两个限制:
Kafka/Kinesis/Pulsar 等“分区日志系统”使流可以像数据库日志那样存储,并通过偏移量实现回放、重算。这是现代流平台的关键基石。

日志成为系统“中枢神经”:
graph TB
subgraph 以日志为中心的基础设施栈
A[Log]
B[Graph DB, OLAP Store, Etc]
C[Key-Value Query Layer]
D[Search Query Layer]
E[Monitoring & Graphs]
F[Stream Processing]
G[Hadoop]
B --> A
C --> A
A --> C
D --> A
E --> A
F --> A
A --> F
G --> A
A --> G
end
这形成了“Log-Centric Architecture”。
---
title: 单事件处理
---
stateDiagram-v2
direction LR
主题 --> 分支: 日志事件
分支 --> 高优先级主题: 错误事件
分支 --> 低优先级主题: 其他事件
高优先级主题 --> 转换成Avro
低优先级主题 --> 转换成Avro
转换成Avro --> Avro日志
用于事件分流、路由、格式转换。
---
title: 本地状态事件处理
---
stateDiagram-v2
direction LR
state 处理器 {
本地状态 --> 聚合min,max
聚合min,max --> 本地状态
}
交易主题 --> 聚合min,max
聚合min,max --> 交易聚合主题
单处理器内部维护可累积的局部状态,如 min/max/count。
---
title: 多阶段处理
---
stateDiagram-v2
state 每日获利处理器1 {
本地状态1 --> 每日获利或损失1
每日获利或损失1 --> 本地状态1
}
state 每日获利处理器2 {
本地状态2 --> 每日获利或损失2
每日获利或损失2 --> 本地状态2
}
state top10处理器 {
top10本地状态 --> top10
top10 --> top10本地状态
}
交易主题 --> 每日获利或损失1
交易主题 --> 每日获利或损失2
每日获利或损失1 --> 每日获利或损失主题
每日获利或损失主题 --> top10
top10 --> top10主题
多阶段计算串联是构建实时指标体系的核心架构。
---
title: 外部数据源填充
---
stateDiagram-v2
direction LR
state 处理器 {
用户信息本地缓存 --> 连接
连接 --> 用户信息本地缓存
}
点击事件主题 --> 连接
用户信息数据库 --> 用户信息主题: cdc
用户信息主题 --> 连接
连接 --> 填充的点击事件主题
典型场景:用户画像、商品信息补全。
流和数据库的关系可用统一视角描述:
也就是“流是表的增量,表是流的累积”。
---
title: 带有快速追随者分析数据库的变更数据获取
---
graph LR
A[应用程序]
B[生产数据库]
C[分析快速跟随数据库]
D[分析]
A -- 生产事务 --> B
B -- CDC --> C
C -- 查询 --> D
CDC 是现代实时数据平台的核心。
DataFlow / Beam 在抽象层面定义了流式计算的关键操作:

其强项在于统一批与流模型。
流处理是“在时间上分布的数据”,而时间本身可能乱序、延迟或缺失,因此必须保证“语义正确”。

事件时间更准确,处理时间更实时。
水位线用于推断“事件时间已经前进到某个点,可以执行窗口计算”。
sequenceDiagram
participant Source as 数据源
participant System as 流处理系统
participant Window as 窗口计算
...
(水位线图保持原样,此处省略描述)
水位线核心作用:
完美水位线几乎不存在,现代系统均使用启发式水位线。
无需窗口,延迟最小。

三大窗口:

事件时间窗口 = 正确但需要缓存 处理时间窗口 = 实时但不稳定

决定窗口何时输出结果。
类型包括:
这是现代流系统输出的核心机制。
包含:
方法包括:
小批作为容错单元(Spark Streaming)。
系统恢复的基本能力(Flink、Beam)。
仅依赖执行顺序,不可持久化。
Flink/Beam 提供的可持久、可并行的结构化状态。
实现“用 SQL 处理流”。
关键思想:
两种模型最终都支持实时计算,但抽象不同。
支持:
保留原图:
---
title: 表连接
---
...
流与表是可相互转换的:
可用于统一批与流:
graph TD
A[Table] --> B[MapRead]
...