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 核心概念关系图
下面这张图把今天讲的所有概念串在一起,你看完应该能一目了然:
2.6 本章小结
今天这几个概念是 Kafka 的基石,我建议你反复理解它们之间的关系:
- Topic 是逻辑分类,Partition 是物理分片
- Producer 写消息,Consumer 读消息
- Broker 是服务器,多个 Broker 组成 Cluster
- 消息是数据单元,偏移量是消息在 Partition 中的位置
把这些概念刻在脑子里,后面讲生产消费流程、副本机制、数据持久化的时候,你就不会觉得乱了。