Kafka 基础教程
Kafka 是一个分布式、高吞吐、可持久化的消息队列系统,用于:
- 日志采集(Log Collect)
- 事件驱动架构(EDA)
- 流式处理(Streaming)
- 日志持久化(Commit Log)
- 系统解耦(微服务解耦)
简单理解:
Kafka 就是一个高性能的“消息中转站”,让系统之间解耦,并能持久化海量数据。
负责发送消息到 Kafka 的 Topic。
可配置:
- 消息是否自动重试
- 消息是否压缩
- 消息是否有序(按分区)
- 是否要求返回 ACK(保证可靠性)
Kafka 集群中的每台服务器就是一个 Broker。
主要功能:
- 存储消息(commit log)
- 为生产者/消费者提供读写服务
- 管理分区、副本
一般生产环境会有:
- 3~9 个 Broker(保证高可用 + 扩展)
Kafka 中数据按主题分类。
类似目录或表:
- 一个 Topic = 高频写 + 高频读的消息集合
例:
- order_created
- user_login_events
Topic 可以拆分成 多个 Partition(分区)以提升吞吐量。
每个 Topic 包含若干 Partition,每个 Partition 是 一个有序、持久化的消息队列。
示例
Topic:order
分区:
- order-0
- order-1
- order-2
特点:
- 分区内消息有序
- 分区间消息无序
- Kafka 吞吐量 ≈ 分区数 * 单分区吞吐
Kafka 的性能扩展方式:
- 想提升性能 -> 加 Partition
- 想提升高可用 -> 加副本(Replica)
Consumer:读取消息的客户端
Consumer Group(消费者组)
多个消费者可以组成一个 Group 来共同消费 Topic。
一个分区只会被同一 Group 中的一个 Consumer 消费。
即:
- Group 内消费者 = 并发消费能力
- 多个 Group = 广播模式
例:
- Topic 分 3 个分区
- Group A 有 3 个消费者
- -> 刚好每人消费一个分区(并发最大)
Kafka 将每个分区的数据保存为一个目录:
/kafka-logs/order-0
底层使用两种文件:
- .log:消息内容
- .index:索引,加速查找
写入是:
- 顺序写磁盘(非常快)
- 利用页缓存(PageCache)
- 零拷贝(Zero-copy)提升读速度
因此 Kafka 能轻松达到百万 QPS。
每个 partition 内,每条消息都有一个递增 ID:
0, 1, 2, 3, 4, ...
消费者记录自己消费到的位置(offset):
- Offset 是消费者的进度,不是 Kafka 的。
好处:
- 每个 Group 都有自己的消费进度(互不影响)
- 可回溯消费(重置 Offset)
每个 Partition 可以设置多副本,如:
replication.factor = 3
分为:
- Leader(主副本)
- Follower(同步副本)
所有读写都在 Leader 进行。
Follower 同步 Leader 的数据。
ISR = 同步速度正常的副本集合。
只有在 ISR 中的 follower 才算“健康”。
当 ISR 掉到只剩 1(Leader 自身)时,会出现风险场景:
- -> 无法保证强一致(acks=all 也可能丢消息)
Producer 可配置:
acks=0
不等待 Kafka 返回
- -> 性能高但可能丢消息
acks=1
等待 Leader 写成功
- -> Leader 宕机会丢消息
acks=all(生产环境推荐)
Leader + ISR 中全部 follower 写成功
- -> 最安全
- -> 慢一些但可靠
当 Consumer Group 中发生:
- 有人加入
- 有人退出
- 分区数量变化
Kafka 会重新分配分区给消费者,称为:Rebalance(再均衡)
缺点:
- Rebalance 期间,消费暂停
- 大量 Group 时容易抖动
需要调优 session.timeout、max.poll.interval 等。
Kafka 3.3 之后引入 KRaft:
- 不再依赖 ZooKeeper
- 自带元数据管理
- 启动速度更快
- 架构更简单
未来生产集群基本都推荐:
Kafka + KRaft(无 ZooKeeper 模式)
- Kafka = 分布式、高吞吐、可持久化的消息系统
- Topic = 数据分类
- Partition = 提升吞吐,内部消息有序
- Producer 发送消息到分区
- Consumer Group 提供并发消费能力
- Offset = 消费进度
- Replication(副本)保证高可用
- ACK 决定可靠性
- Commit Log + 顺序写提升性能
- KRaft 即将成为 Kafka 主流架构