Kafka Streams 是什么
Kafka Streams 是一个客户端库而不是独立计算集群:把它引入普通 Java 应用(或 Kotlin/Scala 应用)后,应用自身就是流处理任务,读写 Kafka 完成过滤、聚合、连接等操作。它用 KStream(事件流)和 KTable(变更表)两个抽象建模,中间状态保存在本地状态存储里,并通过对应的 changelog 主题做容错重建。部署上只需要一个能跑 Java 进程的地方,不依赖 YARN 或 K8s 调度器。
基本信息
| 形态 | 客户端库,嵌入应用运行,非独立集群 |
|---|---|
| 核心抽象 | KStream、KTable、GlobalKTable |
| 容错机制 | 本地状态存储 + changelog 主题重建 |
| 语义保证 | processing.guarantee=exactly_once_v2 支持端到端精确一次 |
| 适用版本 | 随 Kafka 客户端版本发布,需与集群版本兼容 |
典型使用场景
- Kafka 内闭环的轻量流处理:过滤、映射、按 key 聚合计数
- 实时宽表化:KStream 与 KTable 做 stream-table join 补齐维度
- 实时指标:滑动窗口统计订单量、金额、成功率
- 把大主题拆分或重塑为下游专用主题,避免下游解析复杂逻辑
- 作为微服务的一部分,在应用进程内实时处理而不引入新集群
按 key 统计示例
按 key 统计示例
StreamsBuilder builder = new StreamsBuilder(); // 构建流拓扑
KStream<String, String> orders = builder.stream("orders"); // 从 orders 主题读事件
orders.groupByKey() // 按消息 key 分组
.count(Materialized.as("order-counts-store")) // 结果落本地状态存储
.toStream()
.to("order-counts"); // 结果写回 Kafka
// application.id 决定消费组与 changelog 主题名,变更它相当于换一个应用
Properties props = new Properties();
props.put("application.id", "order-counter");
props.put("processing.guarantee", "exactly_once_v2"); // 精确一次需要事务支持关键配置读法
| 配置项 | 含义 | 实践影响 |
|---|---|---|
| application.id | 应用标识,同时作为消费组 ID | 改名会让状态从零重建 |
| state.dir | 本地状态存储目录 | 不持久化则重启后恢复变慢 |
| processing.guarantee | 处理语义保证 | exactly_once_v2 需开启事务 |
| num.stream.threads | 单实例流处理线程数 | 超过分区数会闲置 |
| replication.factor | changelog 主题副本数 | 生产环境不宜为 1 |
Kafka Streams 适合 Kafka 内闭环的轻量流处理;需要连接多种外部系统、复杂事件时间与状态后端时,Flink 这类独立引擎更常见。选型看的是生态与团队运维能力,而不是单纯的吞吐数字。
本地状态目录不持久化或容器重建后丢失,恢复时需要从 changelog 主题重放,恢复时间与状态大小成正比;生产环境要固定挂载状态目录并给足磁盘。