跳到主要内容

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) (另一套业务各自拉)
概念说明
BrokerKafka 集群节点,存分区副本
Topic逻辑主题,一类事件流
Partition物理分片;分区内有序,跨分区不保证全局有序
Offset分区内消息序号;Consumer 用 offset 记录进度
Replica / ISR副本与「同步副本集合」;Leader 写、Follower 同步
Consumer Group同组内一个分区同一时刻只给一个 Consumer;组间互不影响
ZooKeeper / KRaft旧版元数据靠 ZK;新版 KRaft 去 ZK,面试知道趋势即可

Producer 怎么写​

要点说明
分区键相同 key → 同一分区 → 同 key 有序
轮询无 key 时轮询分区,负载均衡
ACK0 不等确认;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 对比​

维度KafkaRabbitMQRocketMQ
模型日志流 / Topic-PartitionExchange + Queue 路由Topic + Queue
吞吐很高中等高
延迟ms 级常见可更低ms 级
顺序分区内单队列分区内 / 顺序消息
典型场景日志、埋点、CDC、流管道业务任务、复杂路由电商、事务消息

生产必谈​

主题要点
副本与 ISRmin.insync.replicas;acks=all 防单点丢
保留策略按时间 / 大小删旧段;不是无限堆
消息过大默认约 1MB 上限;大对象走对象存储 + 发引用
幂等消费业务唯一键、去重表、状态机
监控Lag、Broker 磁盘、Under-replicated partitions

常见误解​

  1. 「Kafka = 普通 MQ」——更像可持久化的分布式 commit log
  2. 「Topic 全局有序」——只有分区内有序,要全局序只能单分区(牺牲并行)
  3. 「发了就不会丢」——取决于 ACK、副本、Producer 重试与 Consumer commit 时机
  4. 「Consumer 越多越好」——不超过分区数;多了也分不到分区

面试速记​

  1. Kafka 是什么? 分布式事件流平台;Topic 分区、高吞吐、持久化。
  2. Partition 和 Consumer Group? 分区并行;同组一分区只一 Consumer;多组独立消费同一 Topic。
  3. 如何保证顺序? 同 key 进同分区;或牺牲并行用单分区。
  4. 为什么快? 顺序写、页缓存、零拷贝、批量、分区扩展。
  5. 重复消费怎么办? at-least-once + 消费幂等;Exactly-once 需事务与端到端设计。