kafak原理
我给你一份面试必背、运维必懂、极简清晰的 Kafka 原理详解,不啰嗦、全是重点。
Kafka 核心原理(一句话版)
Kafka 是分布式、分区、多副本、基于磁盘顺序写 + 零拷贝的高吞吐消息队列。
用来做:异步解耦、削峰、日志收集、流数据处理。
一、核心组件(必须记住)
-
Broker
- Kafka 服务器节点,一个节点 = 一个 Broker
- 多个 Broker 组成集群
-
Topic
- 消息的分类,类似“队列名称”
- 生产者发往 Topic,消费者从 Topic 读
-
Partition(分区)
- Topic 被切分成多个分区,分布在不同 Broker
- 分区内消息有序,分区间无序
- 分区是 Kafka 高吞吐 & 水平扩展的关键
-
Replica(副本)
- 每个分区可以有多个副本(1主多从)
- Leader:负责读写
- Follower:只同步,不提供服务
- 作用:高可用,不丢消息
-
Producer(生产者)
- 发消息到 Topic
- 支持:批量发送、压缩、分区策略
-
Consumer(消费者)
- 从 Topic 拉消息
- 属于 Consumer Group(消费组)
-
Consumer Group
- 一个组内的消费者共同消费一个 Topic
- 一个分区只会被组内一个消费者消费
- 实现:并发消费、负载均衡
-
ZooKeeper / KRaft
- 老版本:ZK 管理集群元数据、Broker 上下线、Controller
- 新版本(2.8+):KRaft 替代 ZK,去掉依赖
二、为什么 Kafka 吞吐量极高?(面试高频)
1. 磁盘顺序写
- 不随机写,顺序写磁盘速度接近内存
- Kafka 把消息 append 到文件末尾
2. PageCache
- 利用操作系统缓存,不直接操作物理磁盘
- 读多命中内存,极快
3. 零拷贝(Zero-Copy)
- 数据直接从内核 -> 网卡
- 减少用户态/内核态切换,少拷贝 2 次
4. 批量发送 + 压缩
- Producer 批量发送,减少网络 IO
- 支持 Gzip/Snappy 等压缩
5. 分区并行
- 多分区 = 多队列 = 多线程并发读写
三、消息写入原理(Producer)
- Producer 按 分区策略 选择分区
- 轮询、随机、按 Key Hash、自定义
- 消息先进入 Producer 内存缓冲区(batch)
- 满足条件(数量/时间)后批量发送给 Leader
- Leader 写入本地磁盘
- Follower 同步拉取
- 全部同步完成 → 返回 ACK
ACK 机制(面试必考)
- acks=0:发完不管,最快,可能丢
- acks=1:Leader 写入即成功,默认
- acks=-1/all:Leader + 全部 Follower 写完才成功,最安全
四、消息消费原理(Consumer)
- Consumer 属于某个 消费组
- 从分区 拉模式(Pull) 取消息
- 消费位点(Offset)存在 Kafka 内部主题
- 一条消息被一个组消费一次,不同组可重复消费
消费模式
- 组内:负载均衡
- 组间:广播消费
五、高可用原理
- 多副本机制
- Leader 挂了,Follower 自动被选为新 Leader
- ISR(同步副本列表)
- 只有跟得上 Leader 的副本才能被选主
- 保证数据不丢
六、数据不丢失、不重复、不乱序
不丢消息
- acks=all
- 副本 >=2
- ISR 机制
- 生产者重试
不重复消费
- 业务做幂等
- Kafka 提供 Producer 幂等、事务
有序性
- 分区内严格有序
- 全局无序
七、面试必背 5 问
-
Kafka 为什么快?
顺序写、PageCache、零拷贝、批量、分区并行。 -
分区和副本的作用?
分区:吞吐、并行。
副本:高可用、不丢数据。 -
Consumer Group 作用?
负载均衡、并发消费、隔离不同业务。 -
ISR 是什么?
与 Leader 保持同步的副本集合,用于选主。 -
如何保证消息不丢失?
acks=all + 多副本 + 生产者重试 + 消费者手动提交位移。
浙公网安备 33010602011771号