Tavio's blog Tavio's blog
首页
  • JVM底层原理
  • 邪恶多线程
  • MyBatis底层原理
  • Spring底层原理
  • MySQL的优化之路
  • ClickHouse的高性能
  • Redis的快速查询
  • RabbitMQ的生产
  • Kafka的高吞吐量
  • ES的入门到入坑
  • MySQL自增ID主键空洞
  • 前端实现长整型排序
  • MySQL无感换表
  • Redis延时双删
  • 高并发秒杀优惠卷
  • AOP无侵入式告警
  • 长短链接跳转
  • 订单超时取消
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Tavio Zhang

努力学习的小码喽
首页
  • JVM底层原理
  • 邪恶多线程
  • MyBatis底层原理
  • Spring底层原理
  • MySQL的优化之路
  • ClickHouse的高性能
  • Redis的快速查询
  • RabbitMQ的生产
  • Kafka的高吞吐量
  • ES的入门到入坑
  • MySQL自增ID主键空洞
  • 前端实现长整型排序
  • MySQL无感换表
  • Redis延时双删
  • 高并发秒杀优惠卷
  • AOP无侵入式告警
  • 长短链接跳转
  • 订单超时取消
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Kafka的深度解析
    • 一、Kafka 核心组件解析
      • 1. Topic:消息的逻辑容器
      • 定义
      • 核心作用
      • 关键特性
      • 2. Partition:消息的物理存储单元
      • 定义
      • 核心作用
      • 分区副本机制
      • 3. Broker:Kafka 集群的物理节点
      • 定义
      • 核心作用
      • 关键特性
      • 4. Producer:消息的生产者
      • 定义
      • 核心作用
      • 关键机制
      • 5. Consumer:消息的消费者
      • 定义
      • 核心作用
      • 关键机制
      • 6. Consumer Group:消费组机制
      • 定义
      • 核心作用
      • 重平衡机制细节
    • 二、核心组件协同关系
    • 三、Kafka vs RabbitMQ:核心差异对比
    • 结语
  • Kafka消息存储
  • Kafka的生产消费
  • 《Kafka》笔记
Tavio
2025-01-11
目录

Kafka的深度解析

Kafka 是由 Apache 基金会开发的分布式流处理平台,最初由 LinkedIn 设计并开源,旨在解决大规模实时数据传输与处理的问题。它以高吞吐量、高可靠性、低延迟为核心优势,广泛应用于日志采集、数据同步、实时分析等场景。

Kafka 的设计围绕「消息生产→存储→消费」全链路展开,通过六大核心组件的协同工作,实现了分布式环境下的高效消息传递。

# 一、Kafka 核心组件解析

Kafka 的所有功能依赖于六大核心组件的联动,它们既各司其职,又相互配合,共同支撑起 Kafka 的高效运行。

# 1. Topic:消息的逻辑容器

# 定义

Topic 是 Kafka 中用于归类消息的逻辑概念,相当于「消息主题标签」。所有 Producer 发送的消息必须绑定一个 Topic,所有 Consumer 必须订阅 Topic 才能获取消息,是连接生产者与消费者的桥梁。

# 核心作用

  • 解耦生产与消费:Producer 只需关注消息所属的 Topic,无需知道具体哪些 Consumer 会消费;Consumer 只需订阅目标 Topic,无需关心消息的生产者,两者通过 Topic 实现完全解耦。
  • 业务隔离:不同业务场景的消息可通过不同 Topic 隔离(如「订单消息」「支付消息」分别对应不同 Topic),避免消息混杂。

# 关键特性

  • 多消费组订阅:一个 Topic 可被多个 Consumer Group 同时订阅,每个消费组都能独立获取该 Topic 的全量消息(类似「广播」效果)。
  • 无实际存储能力:Topic 本身不存储消息,仅作为逻辑标识,消息实际存储在其下的 Partition(分区)中。
  • 动态创建与配置:支持通过命令或 API 动态创建 Topic,创建时需指定分区数、副本数等核心参数(后续可调整副本数,但分区数一旦确定难以修改,需谨慎设置)。

# 2. Partition:消息的物理存储单元

# 定义

Partition 是 Topic 的物理分片,是 Kafka 中实际存储消息的最小单元。创建 Topic 时需指定分区数(默认 1 个),每个 Partition 本质是一个有序、不可变的消息队列,消息始终以「追加」方式写入尾部。

# 核心作用

  • 提升并行能力:

    • Producer 可向 Topic 的不同分区并行发送消息(无需等待单个分区写入完成);
    • Consumer Group 中多个 Consumer 可并行消费不同分区(同一分区仅能被组内一个 Consumer 消费),大幅提升整体吞吐量。
  • 保障消息顺序性:单个分区内的消息按写入时间排序,每个消息对应唯一的 Offset(偏移量,随消息写入递增),确保 Consumer 消费该分区时能按顺序处理。

    ⚠️ 注意:分区顺序性 ≠ 全局顺序性!仅单个分区内消息有序,若需 Topic 全局有序,需将分区数设置为 1(但会牺牲并行能力)。

# 分区副本机制

  • 副本作用:每个 Partition 可配置多个副本(Replica),用于实现高可用。副本分为 Leader 和 Follower:

    • Leader 副本:负责处理所有读写请求(Producer 写入、Consumer 读取均针对 Leader);
    • Follower 副本:仅同步 Leader 的数据,当 Leader 故障时,从 Follower 中选举新 Leader,保证服务不中断。
  • 副本分布:副本会均匀分布在不同 Broker 上(避免单点故障),例如 3 副本的分区,其 Leader 和 2 个 Follower 会分属 3 个不同 Broker。

    ⚠️ 注意:Kafka 副本仅用于数据同步和故障转移,不具备读能力(与 Elasticsearch 副本不同),所有读写均由 Leader 处理。

# 3. Broker:Kafka 集群的物理节点

# 定义

Broker 是运行 Kafka 服务的物理/虚拟节点,是 Kafka 集群的最小部署单元。一个 Kafka 集群通常由奇数个 Broker 组成(避免集群脑裂)。

# 核心作用

  • 存储消息资源:每个 Broker 管理多个 Topic 的不同 Partition(如 Broker1 可能存储「订单 Topic-p0」「支付 Topic-p2」),并将消息持久化到本地磁盘(以日志文件形式存储)。
  • 处理客户端请求:接收 Producer 的消息发送请求、Consumer 的消息拉取请求,并返回处理结果。
  • 集群协同:Broker 之间通过 Zookeeper(或 KRaft,Kafka 2.8+ 可选)协调集群状态(如分区 Leader 选举、Broker 加入/退出)。

# 关键特性

  • 负载均衡:集群会自动将 Topic 的分区均匀分配到不同 Broker,避免单个 Broker 存储过多分区导致性能瓶颈。
  • 控制器(Controller):集群中会选举一个 Broker 作为控制器,负责管理分区 Leader 选举、Broker 上下线等集群级操作,确保集群状态一致。

# 4. Producer:消息的生产者

# 定义

Producer 是向 Topic 发送消息的客户端(如应用程序、日志采集工具等),负责将业务数据转换为 Kafka 可识别的消息格式并发送。

# 核心作用

  • 消息格式封装:将原始业务数据(如 JSON、字符串)封装为 Kafka 消息结构(包含 Key、Value、时间戳、Headers 等)。
  • 保障消息可靠性:通过重试机制、ACK 确认机制避免消息丢失。
  • 优化发送性能:通过批量发送、压缩等机制提升吞吐量。

# 关键机制

  • 分区选择策略:Producer 发送消息时需确定目标分区,默认策略为:
    • 若指定消息 Key,则通过 Key 的哈希值映射到固定分区(保证相同 Key 的消息进入同一分区,便于顺序消费);
    • 若未指定 Key,则采用轮询(Round-Robin)方式均匀分配到各分区。
  • ACK 确认机制:通过 acks 配置控制消息可靠性:
    • acks=0:Producer 发送消息后不等待确认,可能丢失消息(性能最高);
    • acks=1:等待 Leader 分区写入成功后确认(默认值,Leader 故障可能丢失);
    • acks=-1/all:等待 Leader 和所有同步副本(ISR)写入成功后确认(可靠性最高,性能略低)。
  • 批量发送:Producer 会将多个消息攒成一个批次(通过 batch.size 配置批量大小,默认 16KB),当批次满或达到 linger.ms 时间(默认 0ms,即立即发送)时发送,减少网络请求次数。

# 5. Consumer:消息的消费者

# 定义

Consumer 是从 Topic 拉取消息的客户端,负责将 Kafka 消息解析为业务系统可处理的数据并消费(如写入数据库、触发业务逻辑)。

# 核心作用

  • 消息拉取与解析:主动从 Topic 的分区拉取消息,并将 Kafka 消息格式解析为业务数据。
  • Offset 管理:记录每个分区的消费位置(Offset),下次拉取从 Offset+1 开始,避免消息重复消费。

# 关键机制

  • Offset 存储与提交:
    • 存储位置:Kafka 0.10+ 版本中,Offset 存储在内部 Topic __consumer_offsets 中(替代早期的 ZooKeeper,提升可靠性);
    • 提交方式:
      • 自动提交:Consumer 定期(通过 auto.commit.interval.ms,默认 5000ms)自动提交当前 Offset(可能导致消息未处理完就提交,存在丢失风险);
      • 手动提交:业务处理完成后手动调用 API 提交 Offset(推荐,确保消息处理成功后再确认)。
  • 消费模式:Kafka 采用「Pull 模式」,由 Consumer 主动拉取消息,可通过 fetch.min.bytes(最小拉取字节数)和 fetch.max.wait.ms(最大等待时间)控制拉取频率,避免空轮询或消息延迟。

# 6. Consumer Group:消费组机制

# 定义

Consumer Group 是由多个 Consumer 组成的逻辑集合,是 Kafka 实现负载均衡与消息广播的核心机制。

# 核心作用

  • 负载均衡:Topic 的每个分区仅能被 Consumer Group 内的一个 Consumer 消费,多个 Consumer 可并行消费不同分区,提升整体消费效率(如 4 个分区对应 2 个 Consumer,则每个 Consumer 处理 2 个分区)。
  • 广播与单播:
    • 同一消息要被多个业务方消费?为每个业务方创建独立 Consumer Group 即可(广播效果);
    • 同一业务方的多个实例协同消费?用同一个 Consumer Group 实现负载均衡(单播效果)。
  • 动态调整:通过「重平衡(Rebalance)」机制,当 Consumer 数量变化(如新增/下线)、Topic 分区数量变化时,自动重新分配分区与 Consumer 的映射关系。

# 重平衡机制细节

  • 触发条件:Consumer 加入/退出 Group、Topic 分区数变更、Group 订阅的 Topic 变更。
  • 影响:重平衡期间,Group 内所有 Consumer 会暂停消费,可能导致消息处理延迟,需尽量避免频繁触发(如通过设置合理的 session.timeout.ms 和 heartbeat.interval.ms 减少误判)。

# 二、核心组件协同关系

Kafka 各组件的联动流程可概括为:

  1. 生产阶段:Producer 根据分区策略将消息发送到 Topic 的指定 Partition,Broker 接收后将消息写入该 Partition 的 Leader 副本,并同步至 Follower 副本;
  2. 存储阶段:消息以日志文件形式持久化到 Broker 本地磁盘,每个 Partition 的消息按 Offset 顺序存储;
  3. 消费阶段:Consumer Group 中的 Consumer 向 Broker 拉取指定 Partition 的消息,通过 Offset 记录消费位置,消费完成后提交 Offset 确保不重复处理。

简言之:Topic 是消息的逻辑分类,Partition 是物理存储载体,Broker 是存储与服务节点,Producer 负责写入,Consumer 负责读取,Consumer Group 实现消费负载与广播。

# 三、Kafka vs RabbitMQ:核心差异对比

对比方向 Kafka RabbitMQ
存储模型 基于 Topic-Partition-日志文件存储,消息按分区顺序写入磁盘,支持海量消息持久化,依赖 Offset 实现消息回溯 基于 Exchange-Queue 存储,消息先到 Exchange 再路由到 Queue,Queue 默认存内存(可配置持久化),不支持消息回溯
消息路由 仅支持「Topic + Key 哈希」路由到分区,无复杂路由规则 支持 Direct、Topic、Fanout、Headers 等多种路由模式,灵活性更高
吞吐量 高吞吐量(十万级/秒),适合海量数据场景 中等吞吐量(万级/秒),适合中小规模场景
消费模式 Pull 模式(消费者主动拉取,可控制频率) Push 模式(Broker 主动推送,消息到达立即推送)
消息顺序性 单个分区内严格有序,全局有序需单分区 单个 Queue 内有序,多 Queue 无法保证全局有序
可靠性保障 基于分区副本(Leader/Follower)+ ACK 机制 基于消息持久化(磁盘存储)+ 消费确认(ACK)机制
适用场景 日志采集、数据同步、实时分析(高吞吐需求) 业务通知、复杂路由场景(低延迟、灵活路由需求)
社区与生态 生态完善,与 Spark、Flink 等流处理框架深度集成 社区活跃,客户端支持多语言,易用性高

# 结语

Kafka 凭借高吞吐、高可靠的特性,成为分布式系统中消息传递与流处理的核心组件。理解其核心概念(Topic、Partition、Broker 等)及协同机制,是用好 Kafka 的基础。

编辑 (opens new window)
#Kafka
上次更新: 2026/01/21, 19:29:14
Kafka消息存储

Kafka消息存储→

最近更新
01
订单超时取消
01-21
02
双 Token 登录
01-21
03
长短链接跳转
01-21
更多文章>
Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式