Kafka
Apache Kafka 是分布式事件流 / 消息平台:高吞吐、可持久化、按分区有序。中文常音译「卡夫卡」,和作家 Franz Kafka 同名——技术语境里指这套 MQ/流式系统。
通用缓存与 MQ 概念见 缓存与消息队列;本篇专注 Kafka 架构、语义与面试高频点。
Kafka 解决什么
| 痛点 | Kafka 怎么帮 |
|---|---|
| 日志 / 埋点量巨大 | 顺序写盘 + 分区并行,吞吐高 |
| 多下游要同一份数据 | Topic 多 Consumer Group 各自消费 |
| 业务要异步解耦 | Producer 发事件,Consumer 独立扩缩 |
| 实时管道 | Kafka Connect / Streams 做 ETL 与流计算 |
不适合:低延迟 RPC、复杂路由、小消息极低延迟——这类更常看 RabbitMQ 等。
核心架构
Producer ──→ Topic (orders)
├─ Partition 0 [msg0, msg1, msg2, ...]
├─ Partition 1 [...]
└─ Partition 2 [...]
│
Consumer Group A Consumer Group B
(实例1 读 P0, 实例2 读 P1) (另一套业务各自拉)
| 概念 | 说明 |
|---|---|
| Broker | Kafka 集群节点,存分区副本 |
| Topic | 逻辑主题,一类事件流 |
| Partition | 物理分片;分区内有序,跨分区不保证全局有序 |
| Offset | 分区内消息序号;Consumer 用 offset 记录进度 |
| Replica / ISR | 副本与「同步副本集合」;Leader 写、Follower 同步 |
| Consumer Group | 同组内一个分区同一时刻只给一个 Consumer;组间互不影响 |
| ZooKeeper / KRaft | 旧版元数据靠 ZK;新版 KRaft 去 ZK,面试知道趋势即可 |
Producer 怎么写
| 要点 | 说明 |
|---|---|
| 分区键 | 相同 key → 同一分区 → 同 key 有序 |
| 轮询 | 无 key 时轮询分区,负载均衡 |
| ACK | 0 不等确认;1 Leader 落盘;all/-1 等 ISR 全部确认 |
| 幂等 Producer | 单分区有序 + 去重,防网络重试重复 |
| 事务 | 跨分区 exactly-once 写入(与 Consumer 事务配合) |
订单 user_id=42 作 key → 该用户事件进同一分区 → 消费端按用户顺序处理
Consumer 怎么读
| 要点 | 说明 |
|---|---|
| Pull 模型 | Consumer 主动拉 batch,控节奏 |
| offset 提交 | 自动提交 vs 手动提交;先处理再 commit 防丢 |
| Rebalance | 组内成员变化时分区重新分配;注意 stop-the-world 与重复消费 |
| 积压(Lag) | 消费速度 < 生产速度;监控 consumer lag |
投递语义
| 语义 | 含义 | Kafka 现实 |
|---|---|---|
| At-most-once | 最多一次,可能丢 | commit 在前、处理在后 |
| At-least-once | 至少一次,可能重复 | 处理完再 commit,失败重试 |
| Exactly-once | 恰好一次 | 幂等 + 事务 + 外部系统配合,成本高 |
面试答法:默认按 at-least-once 设计,消费端必须幂等。
为什么 Kafka 快(高频)
| 手段 | 直觉 |
|---|---|
| 顺序写 | 追加写 log,减少随机 IO |
| Page Cache | 利用 OS 页缓存,批量刷盘 |
| 零拷贝 | sendfile 少一次用户态拷贝 |
| 批量 | Producer/Consumer 批量收发,摊薄网络开销 |
| 分区并行 | 水平扩展吞吐 |
与 RabbitMQ / RocketMQ 对比
| 维度 | Kafka | RabbitMQ | RocketMQ |
|---|---|---|---|
| 模型 | 日志流 / Topic-Partition | Exchange + Queue 路由 | Topic + Queue |
| 吞吐 | 很高 | 中等 | 高 |
| 延迟 | ms 级常见 | 可更低 | ms 级 |
| 顺序 | 分区内 | 单队列 | 分区内 / 顺序消息 |
| 典型场景 | 日志、埋点、CDC、流管道 | 业务任务、复杂路由 | 电商、事务消息 |
生产必谈
| 主题 | 要点 |
|---|---|
| 副本与 ISR | min.insync.replicas;acks=all 防单点丢 |
| 保留策略 | 按时间 / 大小删旧段;不是无限堆 |
| 消息过大 | 默认约 1MB 上限;大对象走对象存储 + 发引用 |
| 幂等消费 | 业务唯一键、去重表、状态机 |
| 监控 | Lag、Broker 磁盘、Under-replicated partitions |
常见误解
- 「Kafka = 普通 MQ」——更像可持久化的分布式 commit log
- 「Topic 全局有序」——只有分区内有序,要全局序只能单分区(牺牲并行)
- 「发了就不会丢」——取决于 ACK、副本、Producer 重试与 Consumer commit 时机
- 「Consumer 越多越好」——不超过分区数;多了也分不到分区
面试速记
- Kafka 是什么? 分布式事件流平台;Topic 分区、高吞吐、持久化。
- Partition 和 Consumer Group? 分区并行;同组一分区只一 Consumer;多组独立消费同一 Topic。
- 如何保证顺序? 同 key 进同分区;或牺牲并行用单分区。
- 为什么快? 顺序写、页缓存、零拷贝、批量、分区扩展。
- 重复消费怎么办? at-least-once + 消费幂等;Exactly-once 需事务与端到端设计。