2. Kafka 核心概念:Topic 与 Partition、Producer 与 Consumer、Broker 与 Cluster、消息与偏移量

说实话,Kafka 的概念体系并不复杂。但很多初学者容易混淆几个关键角色之间的关系。我刚开始接触时也绕了不少弯路,今天咱们把这些核心概念彻底理清楚。

一句话总结:Kafka 本质上是一个「分布式消息日志系统」。Producer 往日志里写,Consumer 从日志里读,Broker 负责存日志,Topic 就是日志的文件夹。

2.1 Topic 与 Partition:消息的分类与分片

Topic(主题)是 Kafka 中最基础的数据组织单元。你可以把它理解成数据库里的「表」,或者文件系统里的「文件夹」。每条消息都必须属于某个 Topic。

但光有 Topic 还不够。如果所有消息都塞在一个 Topic 里,单台机器的磁盘和网络很快就扛不住了。所以 Kafka 引入了 Partition(分区)。

Partition 是 Topic 的物理分片。每个 Partition 就是一个有序的、不可变的日志文件。消息追加到 Partition 尾部,每个 Partition 内部的消息都有唯一的顺序编号——这就是后面要讲的偏移量。

我个人习惯把 Topic 和 Partition 的关系比作「书」和「页码」:

  • Topic 是一本书的名字
  • Partition 是这本书的不同分册
  • 每个分册内部页码连续,但不同分册之间没有顺序关系

为什么要分区?说白了就两个原因:水平扩展和并行处理。分区数越多,集群能承载的吞吐量就越高。但也不是越多越好——我在项目中遇到过分区数过多导致文件句柄耗尽的情况,嗯,这里要注意。

经验之谈:分区数的设置建议参考集群节点数和目标吞吐量。一般经验值是:分区数 = 节点数 × 2~4。我曾经接手过一个系统,单 Topic 分了 200 个分区,但只有 3 个 Broker,结果大量分区处于 Leader 不均衡状态,消费延迟居高不下。

2.2 Producer 与 Consumer:生产与消费的两端

Producer(生产者)负责把消息发到 Kafka。它不直接跟 Partition 打交道,而是指定 Topic,由 Kafka 决定消息落到哪个 Partition。

Producer 有几个关键行为:

  • 发送确认(acks):0 表示不等待确认,1 表示 Leader 确认,all 表示所有副本确认
  • 重试机制:网络抖动时自动重发
  • 分区策略:默认轮询,也可以按 key 哈希

Consumer(消费者)从 Partition 拉取消息。注意是「拉」,不是「推」。Consumer 主动轮询 Broker,获取新消息。

Consumer 有个重要的概念叫 Consumer Group(消费组)。同一个组内的 Consumer 共同消费一个 Topic,每条消息只会被组内的一个 Consumer 处理。这实现了负载均衡。不同组之间互不影响,各自独立消费。

举个例子:

场景 Consumer Group 数量 效果
订单处理 1 个组,3 个 Consumer 每条订单只被处理一次,3 个 Consumer 分摊压力
订单处理 + 实时监控 2 个组,各 2 个 Consumer 订单组处理业务,监控组实时分析,互不干扰

避坑指南:我曾经遇到过一个线上事故——Consumer 组内的消费者数量超过了分区数。结果多出来的 Consumer 一直空闲,浪费资源不说,还容易让人误以为系统负载很高。记住:组内 Consumer 数不要超过分区数,否则多出来的 Consumer 永远分不到分区。

2.3 Broker 与 Cluster:Kafka 的服务器与集群

Broker 就是运行 Kafka 服务的机器。每个 Broker 有一个唯一的 ID(整数)。Broker 负责接收 Producer 的消息、存储数据、响应 Consumer 的拉取请求。

Cluster(集群)由多个 Broker 组成。集群的好处很明显:

  • 高可用:一台 Broker 挂了,其他 Broker 顶上
  • 高吞吐:多台机器分担读写压力
  • 数据冗余:Partition 的副本分布在不同的 Broker 上

每个 Partition 在集群中有多个副本(Replica)。副本分为 Leader 和 Follower:

  • Leader:负责处理读写请求
  • Follower:从 Leader 同步数据,Leader 挂了就选举新的 Leader

你想想看,如果 Leader 和 Follower 都在同一台 Broker 上,那跟没有副本有什么区别?所以 Kafka 会尽量把副本分散到不同的 Broker 上。

核心原则:副本数不能超过 Broker 数。比如你有 3 台 Broker,副本数最多设 3。设多了也没用,因为没那么多机器放副本。

2.4 消息与偏移量:Kafka 的数据单元与位置标记

消息是 Kafka 存储的最小数据单元。一条消息包含:

  • Key:可选,用于分区路由
  • Value:消息体,业务数据
  • Timestamp:消息产生时间
  • Headers:可选,元数据

偏移量(Offset)是 Partition 内消息的唯一标识。它是一个单调递增的整数,从 0 开始。Consumer 通过偏移量来记录自己消费到了哪里。

偏移量的管理是 Kafka 实现「回溯消费」和「断点续传」的关键。Consumer 可以手动提交偏移量,也可以让 Kafka 自动提交。

我的建议:生产环境中尽量使用手动提交偏移量。自动提交虽然方便,但容易丢消息或重复消费。我曾经因为自动提交间隔设得太长,Consumer 崩溃后重启,结果重复处理了上万条消息——那场面,你懂的。

2.5 核心概念关系图

下面这张图把今天讲的所有概念串在一起,你看完应该能一目了然:

Kafka 核心概念关系图 Producer Consumer Group Kafka Cluster Broker 1 Broker 2 Broker 3 Topic: orders Partition 0 Partition 1 Partition 2 写入消息 拉取消息 Offset: 每条消息唯一编号

2.6 本章小结

今天这几个概念是 Kafka 的基石,我建议你反复理解它们之间的关系:

  • Topic 是逻辑分类,Partition 是物理分片
  • Producer 写消息,Consumer 读消息
  • Broker 是服务器,多个 Broker 组成 Cluster
  • 消息是数据单元,偏移量是消息在 Partition 中的位置

把这些概念刻在脑子里,后面讲生产消费流程、副本机制、数据持久化的时候,你就不会觉得乱了。