2. Kafka 核心概念:Topic、Partition、Producer、Consumer、Broker、Offset、Consumer Group

在构建实时特征管道时,Kafka 作为数据中枢,其核心概念是架构设计的基石。本章将逐一拆解这些概念,并阐明它们在特征管道中的具体角色。

2.1 核心概念全景图

下图展示了 Kafka 集群中各个核心组件之间的协作关系,这是理解后续所有章节的基础。

Kafka 核心概念架构图 Kafka 核心概念架构图 Producer (生产者) Consumer Group (消费者组) Kafka Cluster(Broker 集群) Broker 1 Leader Broker 2 Follower Topic: feature-events Partition 0 Partition 1 Partition 2 Offset: 0, 1, 2, 3, ...(消息序号) 写入 拉取 Consumer A Consumer B Consumer C 核心概念关系说明 • Producer 将消息写入指定 Topic 的某个 Partition。 • Topic 是消息的逻辑分类,Partition 是物理存储单元,每个 Partition 内消息有唯一的 Offset。 • Broker 是 Kafka 服务器节点,负责存储 Partition 数据并处理读写请求。 • Consumer Group 内的每个 Consumer 负责消费一个或多个 Partition,实现并行处理。 • Offset 由 Consumer 自行管理,用于记录消费进度,支持断点续传。

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 特征管道中的概念映射

在实时特征管道中,这些核心概念对应着具体的业务角色:

特征管道概念映射图 特征管道概念映射 Kafka 概念 Topic Partition Offset Consumer Group 特征管道映射 特征事件类型(如 click) 用户 ID 哈希分片 特征版本/时间戳 特征计算服务集群 映射说明 • 每个特征事件类型对应一个 Topic • 按用户 ID 哈希到 Partition,保证同一用户 的特征事件顺序 • Offset 用于追踪特征数据的处理进度 • Consumer Group 对应特征计算服务实例组 • 每个实例负责处理一部分用户的特征

2.4 关键设计原则

常见误区:初学者常将 Topic 视为“队列”,但 Kafka 的 Topic 是“日志”而非队列。消息被消费后不会立即删除,而是根据保留策略(retention policy)过期删除。这意味着多个 Consumer Group 可以独立、重复消费同一 Topic 的数据,互不干扰。

在特征管道设计中,需要牢记以下原则:

  1. Partition 是并行单元:特征管道的吞吐量由 Partition 数量和 Consumer 数量共同决定。
  2. Offset 管理是容错关键:Consumer 应定期提交 Offset,以便在重启后从断点继续消费。
  3. Consumer Group 隔离不同管道阶段:特征计算、特征存储、特征监控应使用不同的 Consumer Group,避免相互影响。
  4. Broker 数量决定集群容量:每个 Broker 的磁盘 I/O 和网络带宽有限,特征管道需要根据数据量合理规划 Broker 规模。

2.5 本章小结