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。

保留策略是 Topic 级别配置,修改后对新写入的日志段生效,已有段按原策略逐步清理,不会立即删除全部历史数据。

一条消息的完整旅程

下面用一张信号链式 SVG 展示从 Producer 到 Consumer 的核心路径,以及 Offset、副本和保留策略在其中的位置。

Kafka 消息链路:Producer → Partition → Offset → Consumer Producer key=user_id acks=all Topic: ml.feature.events Partition 0 Leader B1 Follower B2,B3 Partition 1 Leader B2 Follower B1,B3 Partition 2 Leader B3 Follower B1,B2 offset 0,1,2… offset 0,1,2… offset 0,1,2… Broker Cluster B1 · B2 · B3 | ISR 同步副本 | Controller 选主 replication.factor=3, min.insync.replicas=2 数据保留策略 retention.ms / retention.bytes cleanup.policy=compact Consumer Group: feature-realtime Consumer A P0 Consumer B P1 Consumer C P2 Offset 提交 __consumer_offsets 下次从提交位置继续 同一 key 进入同一分区 → 分区内有序 → 消费组内分区独占 → Offset 精确恢复

关键参数速查与设计建议

概念关键参数/行为机器学习平台建议
Partition决定并行度与顺序边界按峰值吞吐和最大消费实例数取较大值,避免频繁扩分区
Offset分区内单调递增,提交的是下一条位置手动提交,处理成功后再提交,避免丢数
Producerkey 哈希决定分区,acks 决定持久性用实体 ID 作 key,acks=all,开启幂等
Consumer Group组内分区独占,组间广播实时特征与离线归档使用不同消费组
Broker/ClusterLeader/Follower,ISR 选主副本因子 3,min.insync.replicas=2
保留策略时间、大小、compact事件流用时间保留,特征快照用 compact

把这条链路记牢:Producer 按 key 把消息写入某个 Partition,Partition 在 Broker 上以 Offset 顺序持久化,副本保证容错,Consumer Group 按分区并行消费并提交 Offset,保留策略按时间或大小清理旧数据。后续设计特征管道、模型指标采集和实时推理日志时,所有容量、顺序和恢复问题都可以回到这几个概念上定位。