Kafka Streams原理与状态存储(State Store)
请解释Kafka Streams的底层原理,包括Stream Task与Partition的分配关系、Processor Topology、KTable与KStream的区别。同时介绍State Store(状态存储)的实现——RocksDB Store、In-Memory Store、以及Changelog Topic如何保证Exactly-Once和故障恢复。
回答
Yahuda
Kafka Streams核心原理:
-
Stream Task:
- 每个Partition对应一个Stream Task
- Task是并行最小单元,数量等于输入Topic的Partition总数
- Task内部可包含多个Processor节点组成Topology
-
Processor Topology(拓扑图):
Source Node (Kafka Source) ↓ Processor Node (map/filter/transform) ↓ State Store (RocksDB) ↓ Processor Node (aggregate/join) ↓ Sink Node (Kafka Sink) -
KStream vs KTable:
- KStream:无界数据流,每条记录独立,全量处理
- KTable:变更日志流,每个Key只保留最新值(类似数据库表)
- GlobalKTable:全局表,所有Partition加载到所有实例
-
State Store(状态存储):
| 类型 | 存储 | 特点 |
|---|---|---|
| RocksDB Store | 本地RocksDB | 大状态、磁盘存储 |
| In-Memory Store | JVM Heap | 小状态、低延迟 |
| Timestamped Store | RocksDB+时间戳 | 窗口时间管理 |
- 容错机制:
- State Store变更→写入Changelog Topic(同名+
-changelog后缀) - Changelog Topic的Offset与Consumer Offset对齐
- 故障恢复:从Changelog Topic重放到最新Offset
- Exactly-Once:事务性Producer + Changelog幂等写入
- State Store变更→写入Changelog Topic(同名+