Skip to main content
☘️ Septvean's Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Kafka 核心概念

一、Kafka 本质是什么?

Kafka 本质是一个分布式、持久化、可订阅的日志系统(Distributed Commit Log)

它不是传统 MQ,而是:

  • 写多读多
  • 顺序追加
  • 长时间存储
  • 消费者自己维护进度

📌 这一句话是 Kafka 的“灵魂定义”

二、Kafka 为什么要设计成“日志系统”?

传统 MQ(RabbitMQ)的问题:

  • 消息被消费即删除
  • Broker 负责消息状态
  • 扩展性差

Kafka 的选择:

  • 消息永久写入日志
  • 消费进度由 Consumer 自己维护
  • Broker 无状态化(相对)

👉 带来:

  • 高吞吐
  • 可回放
  • 多消费组
  • 易扩展

三、Kafka 的核心组件

1️⃣ Broker

Kafka 的服务节点,负责存储和转发数据。

  • 一个 Kafka 集群 = 多个 Broker
  • 每个 Broker 管理多个 Partition
  • Broker 之间无共享存储

2️⃣ Topic

Topic 是逻辑上的消息分类。

  • Topic 本身不存数据
  • 数据实际存在 Partition 中
  • 一个 Topic = N 个 Partition

3️⃣ Partition(最核心)

Partition 是 Kafka 并行、顺序、扩展的最小单位。

特性:

  • 一个 Partition 内消息有序
  • Partition 只能由一个 Consumer 消费
  • 吞吐 = 分区数 × 单分区能力

📌 设计 Partition 的目的:

  • 提高吞吐
  • 实现水平扩展
  • 支持多 Consumer 并行

4️⃣ Replica(副本)

每个 Partition 会有多个副本,用于高可用。

  • Leader:处理读写
  • Follower:同步 Leader 数据
  • 副本分布在不同 Broker

5️⃣ Leader / Follower

  • Producer / Consumer 只与 Leader 通信
  • Follower 负责拉取数据
  • Leader 挂了 -> ISR 里选新 Leader

四、Kafka 的一致性模型(非常重要)

Kafka 不是强一致系统,而是:

基于 ISR 的高一致性、最终一致模型

ISR(In-Sync Replicas)

同步进度“足够快”的副本集合

  • 只有 ISR 才有资格竞选 Leader
  • ISR 过小 -> 拒绝写入(配合配置)

关键配置:

min.insync.replicas=2
acks=all

LEO / HW

  • LEO:每个副本写入到哪了
  • HW:所有 ISR 都确认的数据

📌 消费者只能读到 HW 之前的数据

五、Kafka 的读写模型(底层核心)

写入模型(Producer -> Broker)

  1. Producer 发送消息
  2. Leader 顺序写磁盘(Append)
  3. Follower 拉取数据
  4. ISR 达标 -> 返回 ACK

📌 Kafka 是先写磁盘,再返回成功

读取模型(Consumer -> Broker)

  1. Consumer 主动拉取(Pull)
  2. 从 Leader 拉取数据
  3. 使用 Page Cache + Zero Copy
  4. Consumer 自己提交 Offset

六、为什么 Kafka 用 Pull 而不是 Push?

原因:

  • Consumer 自控速率
  • 避免 Broker 被慢消费者拖垮
  • 批量拉取效率更高

一句话记忆:

Kafka 把“慢”留给 Consumer,而不是 Broker

七、Offset 是什么?为什么不由 Broker 管理?

Offset = 消费进度(逻辑位置)

Kafka 的选择:

  • Offset 存在 Kafka 内部 Topic(__consumer_offsets)
  • 由 Consumer 自己提交

好处:

  • 多消费组
  • 消费回放
  • Broker 无需维护状态

八、Kafka 的顺序性保证到什么程度?

Kafka 只保证:

同一 Partition 内有序

不保证:

  • Topic 全局有序
  • 多 Partition 有序

想要顺序:

  • 相同业务 key -> 相同 Partition
  • 一个 Partition -> 一个 Consumer 线程

九、Kafka 的存储模型(非常核心)

Log Segment

  • 每个 Partition 是一个日志目录
  • 按 segment 文件切分
  • 顺序追加写

文件类型:

  • .log 数据
  • .index 偏移索引
  • .timeindex 时间索引

数据清理策略

1️⃣ 删除(Delete)

log.cleanup.policy=delete

2️⃣ 压缩(Compact)

log.cleanup.policy=compact

十、Kafka 为什么这么快?

总括:

顺序写磁盘 + Page Cache + Zero Copy + 批量处理 + 分区并行

十一、Kafka 的消费语义

语义 实现方式
At most once 先提交 offset
At least once 处理完再提交
Exactly once 幂等 + 事务

📌 Kafka 默认是 At least once

十二、Kafka 的可扩展性原理

Kafka 扩展的核心:

  • Topic 可加 Partition
  • Broker 可水平扩容
  • Consumer 组自动分配 Partition

⚠️ 但注意:

  • 扩 Broker 不会自动迁移数据
  • 需要手动 reassignment

十三、Kafka 的高可用设计

  • 副本机制
  • ISR
  • Controller 选举
  • Leader 自动切换

📌 Kafka 是“无单点”的(Controller 除外,但可 HA)

十四、Kafka 和传统 MQ 的根本区别

维度 Kafka 传统 MQ
模型 日志 队列
数据删除 不删 消费即删
吞吐 极高 中低
回放 支持 不支持
多订阅 原生 复杂

十五、总结

Kafka 是一个分布式日志系统,通过 Topic 和 Partition 实现高吞吐和水平扩展,通过副本和 ISR 机制保证高可用和一致性。

它采用顺序写磁盘、Page Cache 和零拷贝实现高性能,消费采用 Pull 模型,Offset 由 Consumer 管理,保证灵活的消费语义。