2. Kafka 核心概念:Topic、Partition、Producer、Consumer、Broker、Offset、Consumer Group
在构建实时特征管道时,Kafka 作为数据中枢,其核心概念是架构设计的基石。本章将逐一拆解这些概念,并阐明它们在特征管道中的具体角色。
2.1 核心概念全景图
下图展示了 Kafka 集群中各个核心组件之间的协作关系,这是理解后续所有章节的基础。
2.2 核心概念详解
2.2.1 Broker
Broker 是 Kafka 集群中的单个服务器实例,负责接收来自 Producer 的消息、存储消息并响应 Consumer 的拉取请求。一个 Kafka 集群通常由多个 Broker 组成,以实现高可用和负载均衡。
- 身份标识:每个 Broker 拥有唯一的整数 ID(broker.id)。
- 职责:管理 Partition 的 Leader/Follower 角色、处理读写请求、维护元数据。
- 特征管道场景:特征管道通常需要 3 个以上 Broker 来保证高可用,避免单点故障导致特征数据中断。
2.2.2 Topic 与 Partition
Topic 是消息的逻辑分类,类似于数据库中的表。在实时特征管道中,通常为每种特征事件(如用户点击、订单状态变更)创建一个独立的 Topic。
Partition 是 Topic 的物理分片,每个 Partition 是一个有序的、不可变的日志文件。Partition 是 Kafka 并行处理的核心单元。
| 特性 | Topic | Partition |
|---|---|---|
| 粒度 | 逻辑分类 | 物理存储单元 |
| 数量 | 可创建多个 Topic | 每个 Topic 可包含 1~N 个 Partition |
| 顺序保证 | 不保证跨 Partition 顺序 | Partition 内消息严格有序 |
| 并行度 | 由 Partition 数量决定 | 每个 Partition 可被一个 Consumer 消费 |
| 特征管道作用 | 区分不同特征事件类型 | 支持特征数据的水平扩展与并行处理 |
设计建议:特征管道中,Partition 数量应至少等于下游 Consumer 实例数,以实现最大并行度。同时,Partition 数量不宜过多(建议不超过 Broker 数量的 10 倍),以免增加元数据管理开销。
2.2.3 Offset
Offset 是 Partition 内每条消息的唯一递增序号,从 0 开始。Consumer 通过提交 Offset 来记录消费进度,这是实现“断点续传”和“精确一次语义”的基础。
// 示例:查看 Partition 0 的 Offset 范围
// 使用 kafka-run-class.sh 工具
kafka-run-class.sh kafka.tools.GetOffsetShell \
--broker-list localhost:9092 \
--topic feature-events \
--partitions 0
// 输出示例:
// feature-events:0:0 -- 最小 Offset 为 0
// feature-events:0:1024 -- 最大 Offset 为 1024
2.2.4 Producer
Producer 负责将消息发布到指定的 Topic。在特征管道中,Producer 通常是业务服务或数据采集层。
- 分区策略:Producer 可以指定消息发往哪个 Partition(如按用户 ID 哈希),以保证同一用户的事件进入同一 Partition,从而保证顺序。
- 确认机制(acks):
acks=0:不等待确认,吞吐量最高,可能丢数据。acks=1:等待 Leader 确认,平衡可靠性与性能。acks=all:等待所有副本确认,最可靠,延迟最高。
- 特征管道推荐:使用
acks=1或acks=all,避免特征数据丢失。
2.2.5 Consumer 与 Consumer Group
Consumer 从 Kafka 拉取消息进行处理。Consumer Group 是多个 Consumer 实例的逻辑分组,实现负载均衡和容错。
核心规则:一个 Partition 只能被同一个 Consumer Group 内的一个 Consumer 消费。这意味着 Consumer Group 内的 Consumer 数量不应超过 Topic 的 Partition 总数,否则会有 Consumer 空闲。
下表展示了不同 Consumer 数量下的分区分配情况:
| Consumer 数量 | Partition 数量 | 分配结果 |
|---|---|---|
| 1 | 3 | Consumer 消费所有 3 个 Partition |
| 2 | 3 | Consumer A 消费 2 个,Consumer B 消费 1 个 |
| 3 | 3 | 每个 Consumer 消费 1 个 Partition(最优) |
| 4 | 3 | 3 个 Consumer 各消费 1 个,1 个 Consumer 空闲 |
2.3 特征管道中的概念映射
在实时特征管道中,这些核心概念对应着具体的业务角色:
2.4 关键设计原则
常见误区:初学者常将 Topic 视为“队列”,但 Kafka 的 Topic 是“日志”而非队列。消息被消费后不会立即删除,而是根据保留策略(retention policy)过期删除。这意味着多个 Consumer Group 可以独立、重复消费同一 Topic 的数据,互不干扰。
在特征管道设计中,需要牢记以下原则:
- Partition 是并行单元:特征管道的吞吐量由 Partition 数量和 Consumer 数量共同决定。
- Offset 管理是容错关键:Consumer 应定期提交 Offset,以便在重启后从断点继续消费。
- Consumer Group 隔离不同管道阶段:特征计算、特征存储、特征监控应使用不同的 Consumer Group,避免相互影响。
- Broker 数量决定集群容量:每个 Broker 的磁盘 I/O 和网络带宽有限,特征管道需要根据数据量合理规划 Broker 规模。