1. Kafka 的核心架构?

一条消息的旅程
Producer → 按 key 哈希选分区 → 发送到 Leader 分区
→ Leader 写日志(磁盘顺序写)→ Follower 拉取同步
→ Consumer 组内分配分区 → 拉取(pull)消息 → 消费 → 提交 offset

🎯 面试要点

  • Kafka 是"拉模式"(消费者主动 pull)——消费者可控速率、可批量拉取
  • 对比推模式(RocketMQ 也支持 push 但底层是长轮询):拉模式更适合大数据吞吐

2. Kafka 为什么吞吐高?(必考)

  1. 顺序写盘:分区日志只追加(append-only),磁盘顺序写 ≈ 内存写速度(机械盘顺序 100MB+/s);对比随机写慢 100 倍
  2. 页缓存(PageCache):读写走 OS 页缓存,读写快;零拷贝——消费者读取时用 sendfile(磁盘 → socket 直接传输),省去内核态↔用户态 4 次拷贝
  3. 批量与压缩:生产者攒批发送(batch),Broker 批量存储,消费者批量拉取;消息压缩(lz4/zstd)降低网络与磁盘
  4. 分区并行:多分区多消费者并行,吞吐随分区数扩展
  5. 顺序 IO + 无锁设计:单分区单线程写,减少锁竞争

🎯 面试要点

  • 零拷贝两处:sendfile(消费)+ 直接内存缓冲(生产)——结合网络 IO 模块答
  • 吞吐与延迟的取舍:batch.size / linger.ms 调大吞吐高但延迟增

3. acks 参数与 ISR 机制?

ISR(In-Sync Replicas):与 Leader 保持同步的副本集合。Follower 落后超过 replica.lag.time.max.ms(默认 30s)会被踢出 ISR(落后副本不能参与选举,防数据丢失)。acks=all 时只有 ISR 内副本确认才算成功。

选举:Leader 挂了从 ISR 中选新 Leader(优先 ISR 内、副本数最全者)。

🎯 面试要点

  • 可靠性配置三板斧:acks=all + min.insync.replicas=2(副本数≥3)+ enable.idempotence(幂等生产)
  • Leader 与 Follower 是"拉"同步(Follower 主动拉 Leader),与 MySQL 主从推模式不同

4. 分区策略与消费者重平衡(Rebalance)?

分区策略:key 为空 → 轮询/粘性(sticky);key 非空 → hash(key) % 分区数(相同 key 进同一分区 → 保序)。

Rebalance:消费者组成员变化(加入/离开/崩溃)或分区变化时,重新分配"消费者 ↔ 分区"关系。痛点:Stop-The-World——期间整个组停止消费(老版本),且可能重复消费。新版(增量协调器/static membership)改善。

🎯 面试要点

  • 减少 Rebalance:session.timeout.ms 合理、心跳及时、避免消费者处理过慢(max.poll.interval.ms 内未 poll 会被踢)
  • 分区数建议:≥ 消费者数(否则有消费者空闲);分区数定了再调要重新分布(有代价)
  • 顺序保证:单分区内有序 + 单消费者;多分区全局无序

🎤 常见面试追问

  1. Kafka 为什么吞吐高?(背 4 点)——顺序写盘(append-only 快 100 倍)+ 页缓存/零拷贝(sendfile)+ 批量与压缩 + 分区并行。核心是"把随机写变成顺序写、把拷贝去掉"。
  2. acks=all 就绝对不丢吗?——配合 min.insync.replicas=2(ISR 至少 2 个)才基本不丢;但 ISR 只剩 Leader 时 all 退化为 1。极端(机房全挂)仍可能丢,要同步副本加副本数。
  3. 消息顺序怎么保证?——同 key 的消息进同一分区(key 哈希路由)+ 分区内顺序写 + 消费端单线程处理。Kafka 只能保证"分区内有序"。
  4. 重平衡(Rebalance)为什么有害?——STW:期间整个消费组停止消费(老版本),且可能重复消费(offset 未提交部分)。减少:心跳及时、处理别超 max.poll.interval.ms。
  5. 消费者数能超过分区数吗?——能,但多出来的消费者空闲(一个分区同时只被一个组员消费)。分区数 = 并行度上限。

📖 名词解释(本页术语)

术语 大白话解释
Kafka高吞吐分布式消息系统:日志/埋点/大数据标配。核心概念:Topic/Partition/消费组。
Partition(分区)Topic 下的日志分片:分区内有序、可并行消费,副本存多份防丢失。
Leader / Follower(副本)每个分区的多副本:Leader 负责读写,Follower 从 Leader 拉取同步——读写都在 Leader(Kafka 不做读分流)。
ISR与 Leader 保持同步的副本集合;acks=all 时 ISR 全确认才返回;落后副本被踢出(不能当新 Leader)。
acks(确认级别)生产者确认级别:0(发完就算)、1(Leader 写入即算,默认)、all/-1(ISR 全确认,最可靠)。
Rebalance(重平衡)消费组成员变化时重新分配分区,期间消费暂停(老版本)。
零拷贝(sendfile)数据从磁盘直接到网卡,不走用户态——Kafka 高吞吐的关键之一。
lag(消费滞后)生产进度与消费进度的差距,lag 持续上涨 = 堆积报警信号。
⚠️ 本页面由 AI 生成,内容仅供参考,请以官方文档和实际源码为准。