起源
来源于一场面试,面试官深挖了关于kafka的底层架构,从分布式到pagecache,特此总结一下。
关于架构
当不关注细节时,我们宏观来看,所有的 mq 中间件,都由三部分组成(生产者、队列、消费者),往小里看kafka 就是把其中的队列换成了 broker,这时候我们就可以回答标题中的疑问,一台 Kafka 机器就是一个 Broker。一个集群由多个 Broker 组成。一个 Broker 可以容纳多个 Topic。
谈谈kafka
当前kafka的最后一个版本为4.0.0, 这个版本属于一个里程碑版本, 它的主要变化有两点:
- Kafka Brokers, Connect, and Tools全面拥抱了Java17, 不再支持Java8
- Kafka Clients and Kafka Streams全面拥抱了Java11, 不再支持Java8
- 全面拥抱了KRaft协议, 不再支持zookeeper 也就是说, 当你使用kafka 3.x.x版本时,想要升级到4.0.0版本,需要关注这两点的变化, 并做相应的调整。
谈谈kafka的物理架构
- Broker 进程 = 一台物理机/容器里跑一个 JVM,负责「收消息、写日志、读消息」。
- Broker的Controller线程 = 集群里选出的“大脑”,负责分区 Leader 选举、ISR 列表维护,只参与 leader相关操作不参与消费与生产。注意Kafka ≤2.8 用 ZooKeeper;Kafka ≥3.3 可选 KRaft(摆脱 ZK)。
- Broker的Broker 线程 = 收发数据,处理生产与消费请求,处理副本同步请求,写入磁盘操作,读取磁盘操作。
- Replica = 同一条消息在多台 Broker 上落盘,Leader 处理读写,Follower 异步拉取。
- Network = 客户端 -> Broker、Broker -> Broker 两层网络:客户端 bootstrap.servers 只连任意一台 Broker 即可拿到全集群元数据。Broker 之间走 副本同步协议(基于 TCP 的 Fetch 请求)。
谈谈kafka的逻辑架构
- Topic = 逻辑上的“表/队列”。
- Partition = 水平分片(最小并发单元)。
- Offset = 分区内的全局有序递增 ID(Kafka 不删数据时永远追加)。
- Producer 写入:key 为空 → 轮询 partition;key 非空 → hash(key) % partitions,保证同一 key 顺序。
- Consumer Group = 逻辑上的“订阅者”。组内再均衡(rebalance)把 partition 分配给各个 consumer。每个 partition 在同一时刻只能被组内一个 consumer 处理 → 顺序性保证。
- Log Compaction / Retention = 逻辑上提供“时间窗口”或“Key 保留”两种清理策略。