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 架构中的数据入口。

1. 创建消息
2. 序列化
3. 分区选择
4. 发送

Producer

ProducerRecord

Serializer

Partitioner

Broker

生产者的核心工作流程:
  1. 创建消息:构建 ProducerRecord 对象,包含 Topic、分区(可选)、键(可选)和值
  2. 序列化:将键和值序列化为字节数组,以便网络传输
  3. 分区选择:根据分区器确定消息发送到哪个 Partition

    • 如果指定了分区,直接使用
    • 如果未指定但有键,对键进行哈希取模
    • 如果都未指定,使用轮询算法
  4. 发送:将消息发送到 Broker
生产者关键特性:
特性 说明 配置参数
异步发送 支持异步发送,提高吞吐量 producer.type=async
批量发送 将多条消息打包发送,减少网络开销 batch.sizelinger.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 的架构设计体现了几个重要思想:

  1. 解耦:生产者和消费者完全解耦,通过 Topic 间接通信
  2. 并行:通过 Partition 实现并行处理,支持水平扩展
  3. 持久化:消息持久化存储,支持多次消费和回溯
  4. 可靠性:副本机制确保数据不丢失
  5. 灵活性:消费者组同时支持队列和发布订阅模式

4.3 一句话总结

Kafka 的六大核心组件——Producer、Consumer、Consumer Group、Broker、Topic/Partition、ZooKeeper/KRaft——各司其职又紧密协作,共同构成了一个高吞吐、可持久化、分布式的消息系统,为现代数据驱动应用提供了坚实的基础设施。

在这里插入图片描述

🌺The End🌺点点关注,收藏不迷路🌺
© 版权声明

相关文章