Kafka 基本架构深度解析:六大核心组件各司其职
Kafka 基本架构深度解析:六大核心组件各司其职
-
- 一、Kafka 架构概览
-
- 1.1 整体架构图
- 1.2 组件总览
- 二、核心组件详解
-
- 2.1 Producer:消息生产者
-
- 生产者的核心工作流程:
- 生产者关键特性:
- 2.2 Consumer:消息消费者
-
- 消费者的核心概念:
- 2.3 Consumer Group:消费者组
-
- 消费者组的核心特性:
- 2.4 Broker:消息代理服务器
-
- Broker 的核心职责:
- Broker 的重要配置:
- 2.5 Topic 与 Partition:消息的逻辑分类与物理分区
-
- Partition 的核心特性:
- 分区分配规则:
- 2.6 ZooKeeper/KRaft:集群协调服务
-
- ZooKeeper 存储的元数据:
- KRaft:从 ZooKeeper 到自管理
- 三、组件间协作流程
-
- 3.1 生产者消息发布流程
- 3.2 消费者消息拉取流程
- 四、总结
-
- 4.1 组件速查表
- 4.2 架构设计核心思想
- 4.3 一句话总结
|
🌺The Begin🌺点点关注,收藏不迷路🌺
|
摘要:理解 Kafka 的架构是掌握其强大功能的基础。一个典型的 Kafka 集群由多个组件协同工作,共同实现高吞吐、可持久化、分布式的消息传递能力。本文将深入剖析 Kafka 的六大核心组件——Producer、Consumer、Consumer Group、Broker、Topic 和 Partition、ZooKeeper/KRaft,通过详细的流程图和架构图,揭示每个组件的作用及其相互间的协作关系。
一、Kafka 架构概览
1.1 整体架构图
在深入每个组件之前,我们先从整体上俯瞰 Kafka 的架构。下图展示了 Kafka 的核心组件及其交互关系:
消费者层
Kafka 集群
生产者层
消费组2
消费组1
Broker 3
Broker 1
Broker 2
Topic1-Part0
Follower
Topic1-Part1
Leader
Producer 1
Producer 2
Producer 3
ZooKeeper/KRaft
协调服务
Topic1-Part0
Leader
Topic1-Part1
Follower
Topic2-Part0
Leader
Broker1
Broker2
Broker3
消费组1
消费组2
Consumer 1
Consumer 2
Consumer 3
Consumer 4
1.2 组件总览
Kafka 架构由以下六大核心组件构成,它们各司其职,共同构成了一个完整的消息系统:
| 组件 | 主要作用 | 数量 |
|---|---|---|
| Producer | 消息生产者,向 Topic 发布消息 | 多个 |
| Consumer | 消息消费者,从 Topic 订阅消息 | 多个 |
| Consumer Group | 消费者组,实现消息的负载均衡和广播 | 多个 |
| Broker | 消息代理服务器,存储和转发消息 | 集群(≥1) |
| Topic & Partition | 消息的逻辑分类和物理分区 | 多个 |
| ZooKeeper/KRaft | 集群协调服务,管理元数据 | 1 个 ensemble |
二、核心组件详解
2.1 Producer:消息生产者
Producer(生产者)是消息的源头,负责将数据发布到指定的 Topic。它是 Kafka 架构中的数据入口。
Producer
ProducerRecord
Serializer
Partitioner
Broker
生产者的核心工作流程:
-
创建消息:构建
ProducerRecord对象,包含 Topic、分区(可选)、键(可选)和值 - 序列化:将键和值序列化为字节数组,以便网络传输
-
分区选择:根据分区器确定消息发送到哪个 Partition
- 如果指定了分区,直接使用
- 如果未指定但有键,对键进行哈希取模
- 如果都未指定,使用轮询算法
- 发送:将消息发送到 Broker
生产者关键特性:
| 特性 | 说明 | 配置参数 |
|---|---|---|
| 异步发送 | 支持异步发送,提高吞吐量 | producer.type=async |
| 批量发送 | 将多条消息打包发送,减少网络开销 |
batch.size、linger.ms
|
| 消息压缩 | 支持压缩消息体(gzip、snappy、lz4、zstd) | compression.type |
| 可靠性保证 | 可配置消息确认机制 |
acks(0、1、-1/all) |
| 幂等性 | 防止重复发送(Kafka 0.11+) | enable.idempotence=true |
2.2 Consumer:消息消费者
Consumer(消费者)是消息的归宿,负责从 Topic 拉取消息并进行处理。Consumer 采用 拉取模式,主动向 Broker 请求数据。
// 消费者核心逻辑
while (true) {
ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
for (ConsumerRecord<String, String> record : records) {
// 处理消息
process(record);
}
consumer.commitSync(); // 提交偏移量
}
消费者的核心概念:
| 概念 | 说明 |
|---|---|
| Offset | 消息在 Partition 中的位置,由 Consumer 自己维护 |
| 消费位置 | Consumer 可以指定从最新、最早或特定 Offset 开始消费 |
| 自动提交 | 定时自动提交 Offset,简化开发但可能导致重复消费 |
| 手动提交 | 业务处理完成后手动提交 Offset,确保至少一次语义 |
| Rebalance | 消费者组内成员变动时,重新分配 Partition |
2.3 Consumer Group:消费者组
Consumer Group(消费者组)是 Kafka 实现灵活消费模型的核心。它将多个 Consumer 组织在一起,共同消费 Topic 的消息。
消费者组B(3个消费者)
消费者组A(2个消费者)
Topic(4个Partition)
Partition 0
Partition 1
Partition 2
Partition 3
Consumer A1
Consumer A2
Consumer B1
Consumer B2
Consumer B3
Partition 3 未分配
消费者数量(3) < 分区数(4)
消费者组的核心特性:
| 特性 | 说明 | 应用场景 |
|---|---|---|
| 负载均衡 | 组内消费者分摊 Partition 消费 | 高吞吐量消息处理 |
| 故障转移 | 消费者故障时,其 Partition 自动分配给其他成员 | 高可用消费 |
| 队列模式 | 组内竞争消费,一条消息只被一个消费者处理 | 任务队列 |
| 广播模式 | 多个消费者组各自消费,一条消息可被多组处理 | 多业务订阅 |
重要约束:一个 Partition 只能被同一个 Consumer Group 内的一个 Consumer 消费,因此 Consumer Group 内的 Consumer 数量不应超过 Partition 总数,否则会有消费者闲置。
2.4 Broker:消息代理服务器
Broker 是 Kafka 集群中的单个服务节点,负责消息的存储、转发和管理。一个或多个 Broker 组成 Kafka 集群。
Kafka Broker 内部结构
Client
生产者/消费者
Network Layer
网络层
Replica Manager
副本管理器
Process Threads
处理线程
Log Manager
日志管理器
磁盘文件
Broker 的核心职责:
| 职责 | 说明 |
|---|---|
| 消息存储 | 接收 Producer 发送的消息,追加到 Partition 日志文件 |
| 消息拉取 | 处理 Consumer 的拉取请求,返回消息数据 |
| 副本管理 | 维护 Partition 的 Leader/Follower 副本 |
| Leader 选举 | 当 Leader 副本故障时,选举新的 Leader |
| 元数据管理 | 维护 Topic、Partition、Consumer Group 等元数据 |
Broker 的重要配置:
# broker.id 是 Broker 在集群中的唯一标识
broker.id=1
# 监听端口
listeners=PLAINTEXT://:9092
# 日志存储目录
log.dirs=/data/kafka-logs
# 日志保留策略
log.retention.hours=168 # 默认保留7天
log.retention.bytes=-1 # 不限大小
# 副本相关配置
num.replica.fetchers=2 # 副本拉取线程数
replica.fetch.max.bytes=1048576 # 副本同步最大字节数
2.5 Topic 与 Partition:消息的逻辑分类与物理分区
Topic 是 Kafka 对消息进行逻辑分类的单位,类似于数据库中的表。生产者将消息发送到特定的 Topic,消费者从感兴趣的 Topic 订阅消息。
Partition 是 Topic 的物理分区,是实现高吞吐和并行处理的关键。
Topic A
Partition 0
消息0,1,2…
Partition 1
消息0,1,2…
Partition 2
消息0,1,2…
Broker 1
Broker 2
Broker 3
Partition 的核心特性:
| 特性 | 说明 | 作用 |
|---|---|---|
| 顺序性 | 每个 Partition 内部消息严格有序 | 保证局部顺序 |
| 并行性 | 多个 Partition 可并行读写 | 提升吞吐量 |
| 分布式存储 | Partition 可分布在多个 Broker 上 | 实现水平扩展 |
| 冗余副本 | Partition 有多个副本,保证高可用 | 故障容错 |
分区分配规则:
// 默认分区器逻辑
public int partition(String topic, Object key, byte[] keyBytes,
Object value, byte[] valueBytes, Cluster cluster) {
List<PartitionInfo> partitions = cluster.partitionsForTopic(topic);
int numPartitions = partitions.size();
if (keyBytes == null) {
// 无键:轮询
int nextValue = nextValue(topic);
return Utils.toPositive(nextValue) % numPartitions;
} else {
// 有键:对键哈希取模
return Utils.toPositive(Utils.murmur2(keyBytes)) % numPartitions;
}
}
2.6 ZooKeeper/KRaft:集群协调服务
ZooKeeper 在传统 Kafka 架构中担任协调服务的角色,负责管理集群元数据、Broker 注册、Leader 选举等。
ZooKeeper Ensemble
Kafka 集群
注册/心跳
注册/心跳
注册/心跳
Broker 1
Broker 2
Broker 3
ZooKeeper 1
ZooKeeper 2
ZooKeeper 3
ZooKeeper 存储的元数据:
| 元数据 | 说明 |
|---|---|
| Broker 列表 | 记录所有存活的 Broker 节点 |
| Topic 信息 | Topic 列表、Partition 数量、副本配置 |
| Partition Leader | 每个 Partition 的 Leader 副本所在 Broker |
| Consumer Group | 消费者组的成员信息、Offset 位置(旧版本) |
| Controller 信息 | 当前 Controller Broker 是谁 |
KRaft:从 ZooKeeper 到自管理
从 Kafka 2.8.0 开始,引入了 KRaft(Kafka Raft 协议) 模式,将协调功能内置到 Kafka 自身,从而消除了对 ZooKeeper 的依赖。
KRaft 架构(Kafka 自管理)
元数据同步
元数据同步
元数据同步
Kafka Controller 1
Kafka Controller 2
Kafka Controller 3
Kafka Broker
传统架构(Kafka + ZooKeeper)
Kafka Broker
ZooKeeper
Kafka Broker
Kafka Broker
KRaft 的优势:
- 简化架构:无需独立部署 ZooKeeper 集群
- 提升稳定性:避免 ZooKeeper 成为瓶颈
- 简化运维:单一系统,统一监控和管理
三、组件间协作流程
3.1 生产者消息发布流程
ZooKeeper/KRaft
Broker
Producer
ZooKeeper/KRaft
Broker
Producer
1. 获取 Topic 元数据
2. 返回 Partition 信息
3. 确定目标 Partition
4. 发送消息
5. 写入本地日志
6. 同步到副本(如果 acks=all)
7. 返回响应(ack)
3.2 消费者消息拉取流程
ZooKeeper/KRaft
Broker
Consumer
ZooKeeper/KRaft
Broker
Consumer
1. 加入消费者组
2. 分配 Partition
3. 拉取消息(带 Offset)
4. 从日志读取消息
5. 返回消息
6. 处理消息
7. 提交 Offset
四、总结
4.1 组件速查表
| 组件 | 一句话描述 | 数量 | 状态 |
|---|---|---|---|
| Producer | 消息的源头,负责发布数据 | 多个 | 无状态 |
| Consumer | 消息的归宿,负责拉取和处理 | 多个 | 无状态 |
| Consumer Group | 消费者组织单元,实现负载均衡 | 多个 | 有状态(Offset) |
| Broker | 消息代理节点,存储和转发消息 | 集群(≥1) | 有状态 |
| Topic | 消息的逻辑分类 | 多个 | 逻辑概念 |
| Partition | 消息的物理分区,实现并行 | 多个 | 物理存储 |
| ZooKeeper/KRaft | 集群协调服务 | 1 ensemble | 有状态 |
4.2 架构设计核心思想
Kafka 的架构设计体现了几个重要思想:
- 解耦:生产者和消费者完全解耦,通过 Topic 间接通信
- 并行:通过 Partition 实现并行处理,支持水平扩展
- 持久化:消息持久化存储,支持多次消费和回溯
- 可靠性:副本机制确保数据不丢失
- 灵活性:消费者组同时支持队列和发布订阅模式
4.3 一句话总结
Kafka 的六大核心组件——Producer、Consumer、Consumer Group、Broker、Topic/Partition、ZooKeeper/KRaft——各司其职又紧密协作,共同构成了一个高吞吐、可持久化、分布式的消息系统,为现代数据驱动应用提供了坚实的基础设施。

|
🌺The End🌺点点关注,收藏不迷路🌺
|