2. Confluent Kafka核心概念精讲
要真正把 Kafka 用起来,必须先建立一套“数据在集群里如何被写入、存储、读取和清理”的空间与时间模型。Kafka 的核心概念并不是彼此孤立的术语,而是一条从生产者到磁盘、再到消费者的完整链路。理解这条链路,才能在设计机器学习数据平台时正确决定分区数、副本数、消费组划分和保留策略。
Topic 与 Partition:逻辑分类与物理并行
Topic 是消息的逻辑分类,例如 ml.feature.events、ml.model.metrics。但 Topic 本身不是存储单元,它被切分为一个或多个 Partition。Partition 才是 Kafka 真正追加写入、顺序存储和并行消费的基本单位。每个 Partition 在 Broker 上对应一个有序的日志段(log segment)目录,消息以追加方式写入,位置由 Offset 标识。
分区带来两个关键能力:横向扩展与消费并行度。一个 Topic 有 N 个分区,就可以被最多 N 个同一消费组内的消费者并行读取。若消费者数超过分区数,多出的消费者会空闲。因此分区数往往需要结合目标吞吐和最大并行消费实例数来估算。例如一个特征事件 Topic 预计峰值 60 MB/s,单分区实测可稳定承载 10 MB/s,则至少需要 6 个分区;若希望消费端最多 12 个实例并行,则应取 12 个分区。分区数只能增加不能减少,增加后同一 key 的消息可能落到不同分区,因此对顺序敏感的场景要谨慎。
Offset:分区内的唯一坐标
Offset 是消息在某个 Partition 内的单调递增编号,从 0 开始。它只在单个分区内唯一,不同分区之间没有可比性。消费者提交的 Offset 表示“下一条要读的位置”,而不是“已读的最后一条”。例如提交 offset=105,意味着 0~104 已被处理,下次从 105 开始。Kafka 的消费进度因此可以精确恢复,这也是它适合流式特征回放和模型指标重放的基础。
Producer、Consumer 与消费组
Producer 负责把消息追加到指定 Topic 的某个分区。分区选择规则通常是:指定了 key 则按 key 哈希取模,未指定 key 则按粘性分区或轮询策略分配。对机器学习场景,常用 user_id 或 device_id 作为 key,保证同一实体的行为事件进入同一分区,从而在消费端保持局部顺序。
Consumer 以消费组(Consumer Group)为单位订阅 Topic。Kafka 保证同一分区在同一时刻只被组内一个消费者读取,从而实现“组内负载均衡、组间广播”。例如实时特征计算组和离线归档组可以各自独立消费同一 Topic,互不影响。消费者通过 poll() 拉取消息,处理完成后提交 Offset;若开启自动提交,可能在处理失败前就提交,导致消息丢失,因此生产环境更推荐手动提交。
Broker 与 Cluster:存储与协调的物理载体
Broker 是运行 Kafka 服务的单个节点,负责接收写入、持久化日志、响应读取。多个 Broker 组成 Cluster。每个 Partition 有一个 Leader 和若干 Follower,Leader 处理读写,Follower 异步或同步复制。当 Leader 故障时,控制器从 ISR(同步副本集合)中选出新 Leader。副本因子 replication.factor=3 表示每个分区有 3 份副本,可容忍 2 个 Broker 故障而不丢数据。生产环境通常要求 min.insync.replicas=2 且 Producer 使用 acks=all,以确保写入被至少两个副本确认。
数据保留策略:时间、大小与压实
Kafka 不会永久保存所有消息,保留策略决定数据何时被删除。常见策略有三类:
- 时间保留:
retention.ms,默认 7 天。超过时间的日志段被删除。 - 大小保留:
retention.bytes,按分区日志总大小上限删除最旧段。 - 日志压实:
cleanup.policy=compact,保留每个 key 的最新值,适合存储特征快照、模型配置等“状态型”数据。
对机器学习平台,原始行为事件通常用时间保留(如 3~7 天)控制成本;特征快照表则用 compact 策略长期保留最新特征值。若同时需要时间和压实,可配置 cleanup.policy=compact,delete。
一条消息的完整旅程
下面用一张信号链式 SVG 展示从 Producer 到 Consumer 的核心路径,以及 Offset、副本和保留策略在其中的位置。
关键参数速查与设计建议
| 概念 | 关键参数/行为 | 机器学习平台建议 |
|---|---|---|
| Partition | 决定并行度与顺序边界 | 按峰值吞吐和最大消费实例数取较大值,避免频繁扩分区 |
| Offset | 分区内单调递增,提交的是下一条位置 | 手动提交,处理成功后再提交,避免丢数 |
| Producer | key 哈希决定分区,acks 决定持久性 | 用实体 ID 作 key,acks=all,开启幂等 |
| Consumer Group | 组内分区独占,组间广播 | 实时特征与离线归档使用不同消费组 |
| Broker/Cluster | Leader/Follower,ISR 选主 | 副本因子 3,min.insync.replicas=2 |
| 保留策略 | 时间、大小、compact | 事件流用时间保留,特征快照用 compact |
把这条链路记牢:Producer 按 key 把消息写入某个 Partition,Partition 在 Broker 上以 Offset 顺序持久化,副本保证容错,Consumer Group 按分区并行消费并提交 Offset,保留策略按时间或大小清理旧数据。后续设计特征管道、模型指标采集和实时推理日志时,所有容量、顺序和恢复问题都可以回到这几个概念上定位。