Kafka 核心概念
Kafka 本质是一个分布式、持久化、可订阅的日志系统(Distributed Commit Log)
它不是传统 MQ,而是:
- 写多读多
- 顺序追加
- 长时间存储
- 消费者自己维护进度
📌 这一句话是 Kafka 的“灵魂定义”
传统 MQ(RabbitMQ)的问题:
- 消息被消费即删除
- Broker 负责消息状态
- 扩展性差
Kafka 的选择:
- 消息永久写入日志
- 消费进度由 Consumer 自己维护
- Broker 无状态化(相对)
👉 带来:
- 高吞吐
- 可回放
- 多消费组
- 易扩展
Kafka 的服务节点,负责存储和转发数据。
- 一个 Kafka 集群 = 多个 Broker
- 每个 Broker 管理多个 Partition
- Broker 之间无共享存储
Topic 是逻辑上的消息分类。
- Topic 本身不存数据
- 数据实际存在 Partition 中
- 一个 Topic = N 个 Partition
Partition 是 Kafka 并行、顺序、扩展的最小单位。
特性:
- 一个 Partition 内消息有序
- Partition 只能由一个 Consumer 消费
- 吞吐 = 分区数 × 单分区能力
📌 设计 Partition 的目的:
- 提高吞吐
- 实现水平扩展
- 支持多 Consumer 并行
每个 Partition 会有多个副本,用于高可用。
- Leader:处理读写
- Follower:同步 Leader 数据
- 副本分布在不同 Broker
- Producer / Consumer 只与 Leader 通信
- Follower 负责拉取数据
- Leader 挂了 -> ISR 里选新 Leader
Kafka 不是强一致系统,而是:
基于 ISR 的高一致性、最终一致模型
同步进度“足够快”的副本集合
- 只有 ISR 才有资格竞选 Leader
- ISR 过小 -> 拒绝写入(配合配置)
关键配置:
min.insync.replicas=2
acks=all
LEO / HW
- LEO:每个副本写入到哪了
- HW:所有 ISR 都确认的数据
📌 消费者只能读到 HW 之前的数据
写入模型(Producer -> Broker)
- Producer 发送消息
- Leader 顺序写磁盘(Append)
- Follower 拉取数据
- ISR 达标 -> 返回 ACK
📌 Kafka 是先写磁盘,再返回成功
读取模型(Consumer -> Broker)
- Consumer 主动拉取(Pull)
- 从 Leader 拉取数据
- 使用 Page Cache + Zero Copy
- Consumer 自己提交 Offset
原因:
- Consumer 自控速率
- 避免 Broker 被慢消费者拖垮
- 批量拉取效率更高
一句话记忆:
Kafka 把“慢”留给 Consumer,而不是 Broker
Offset = 消费进度(逻辑位置)
Kafka 的选择:
- Offset 存在 Kafka 内部 Topic(__consumer_offsets)
- 由 Consumer 自己提交
好处:
- 多消费组
- 消费回放
- Broker 无需维护状态
Kafka 只保证:
同一 Partition 内有序
不保证:
- Topic 全局有序
- 多 Partition 有序
想要顺序:
- 相同业务 key -> 相同 Partition
- 一个 Partition -> 一个 Consumer 线程
Log Segment
- 每个 Partition 是一个日志目录
- 按 segment 文件切分
- 顺序追加写
文件类型:
- .log 数据
- .index 偏移索引
- .timeindex 时间索引
log.cleanup.policy=delete
log.cleanup.policy=compact
总括:
顺序写磁盘 + Page Cache + Zero Copy + 批量处理 + 分区并行
| 语义 | 实现方式 |
|---|---|
| At most once | 先提交 offset |
| At least once | 处理完再提交 |
| Exactly once | 幂等 + 事务 |
📌 Kafka 默认是 At least once
Kafka 扩展的核心:
- Topic 可加 Partition
- Broker 可水平扩容
- Consumer 组自动分配 Partition
⚠️ 但注意:
- 扩 Broker 不会自动迁移数据
- 需要手动 reassignment
- 副本机制
- ISR
- Controller 选举
- Leader 自动切换
📌 Kafka 是“无单点”的(Controller 除外,但可 HA)
| 维度 | Kafka | 传统 MQ |
|---|---|---|
| 模型 | 日志 | 队列 |
| 数据删除 | 不删 | 消费即删 |
| 吞吐 | 极高 | 中低 |
| 回放 | 支持 | 不支持 |
| 多订阅 | 原生 | 复杂 |
Kafka 是一个分布式日志系统,通过 Topic 和 Partition 实现高吞吐和水平扩展,通过副本和 ISR 机制保证高可用和一致性。
它采用顺序写磁盘、Page Cache 和零拷贝实现高性能,消费采用 Pull 模型,Offset 由 Consumer 管理,保证灵活的消费语义。