Kafka 的整体架构和核心概念是什么?
简化版
Kafka 的核心概念:Producer(生产者)发消息、Consumer(消费者)收消息、Broker(服务器节点)存消息,多个 Broker 组成集群。消息按 Topic(主题)分类,每个 Topic 分成多个 Partition(分区,是并行和存储的基本单位),分区内消息有序、用 Offset(偏移量)标识位置。分区有多个**副本(Replica)**做冗余,一个是 Leader(读写)其余是 Follower(同步备份)。Consumer Group(消费者组)实现「组内分摊消费、组间广播」——同一分区在一个组内只被一个消费者消费。早期靠 ZooKeeper 管理元数据(新版转向 KRaft)。
详细版
核心概念一览:
| 概念 | 说明 |
|---|---|
| Producer | 生产者,发送消息到指定 Topic |
| Consumer | 消费者,从 Topic 拉取消息 |
| Broker | Kafka 服务器节点,存储消息;多个组成集群 |
| Topic | 消息的逻辑分类(主题) |
| Partition | 分区,Topic 的物理分片,并行和有序的基本单位 |
| Offset | 分区内每条消息的唯一递增编号(消费位置) |
| Replica | 分区副本,Leader 负责读写、Follower 同步备份 |
| ISR | In-Sync Replicas,与 Leader 保持同步的副本集合 |
| Consumer Group | 消费者组,组内分摊消费、组间各自广播 |
消费者组的关键规则:一个分区在同一个消费者组内只能被一个消费者消费(保证组内不重复),所以消费者数 ≤ 分区数才能全部有活干。不同消费者组各自独立消费全量消息(广播效果)。
完整版教学
一、整体架构:生产者、Broker 集群、消费者
Kafka 是一个分布式的发布订阅消息系统,三大角色:
- Producer(生产者):产生消息,发送到某个 Topic。
- Broker(服务器):Kafka 的服务节点,负责接收、存储、转发消息。多个 Broker 组成集群,数据分布在各节点上。
- Consumer(消费者):订阅 Topic,从中拉取消息消费。
生产者写、Broker 存、消费者读,三者通过 Topic 组织起来。
二、Topic 与 Partition:逻辑分类 + 物理分片
Topic(主题) 是消息的逻辑分类——比如「订单消息」「日志消息」各是一个 Topic,生产者按 Topic 发、消费者按 Topic 订阅。
但一个 Topic 如果只是一个大队列,就无法并行、无法扩展。所以每个 Topic 被拆成多个 Partition(分区):
- 分区是物理存储单位:每个分区是一个独立的、只追加的日志文件,分布在不同 Broker 上。
- 分区是并行单位:多个分区可以被多个消费者并行消费,多个 Broker 并行读写。
- 分区内有序,分区间无序:同一分区的消息按写入顺序排列(用 Offset 标识),但跨分区没有全局顺序。
生产者发消息时,通过 key 的哈希(或轮询)决定消息进哪个分区。
三、Offset:消费位置的书签
Offset(偏移量) 是分区内每条消息的唯一、递增的编号,标识消息在分区里的位置。它有两层含义:
- 消息的位置:分区里第 0 条、第 1 条、第 2 条……
- 消费的进度:消费者记录「我消费到哪个 offset 了」(提交 offset),下次从这里继续。
消费进度(offset)由消费者组维护——存在 Kafka 内部的 __consumer_offsets Topic 里。手动/自动提交 offset 决定了消费的可靠性(提交早了可能丢消息,提交晚了可能重复消费)。
四、副本机制:Leader、Follower 与 ISR
为了高可用(一个 Broker 挂了数据不丢),每个分区有多个副本(Replica),分布在不同 Broker 上:
- Leader 副本:负责该分区的所有读写请求。
- Follower 副本:从 Leader 同步数据,作为备份,不直接对外服务。
- ISR(In-Sync Replicas):与 Leader 保持同步的副本集合。只有 ISR 中的副本才有资格在 Leader 挂掉时被选为新 Leader。
故障转移:Leader 所在 Broker 宕机时,从 ISR 中选一个 Follower 成为新 Leader,继续服务,数据不丢(前提是 acks=all + min.insync.replicas 配置得当)。这套机制保证了 Kafka 的高可用和数据可靠。
五、消费者组:分摊消费 + 广播
Consumer Group(消费者组) 是 Kafka 消费模型的精髓,它同时实现了「队列」和「发布订阅」两种语义:
组内——分摊消费(队列语义):
- 同一个消费者组内,一个分区只会被组内的一个消费者消费(不会重复)。
- 组内的多个消费者分摊该 Topic 的所有分区,各消费一部分,实现负载均衡和并行。
- 关键推论:消费者数量超过分区数无意义(多出的消费者分不到分区、空闲)。所以并行度上限 = 分区数。
组间——广播(发布订阅语义):
- 不同的消费者组各自独立消费同一个 Topic 的全部消息,互不影响。
- 比如「订单 Topic」被「库存组」「积分组」「大数据组」三个组订阅,每个组都能收到全量订单消息,各干各的。
当消费者组内消费者数量变化(加入/退出/宕机),会触发 Rebalance(重平衡),重新分配分区给消费者。Rebalance 期间消费会短暂停止。
六、常见误区与追问
| 考点 | 正确口径 |
|---|---|
| Topic/Partition | Topic 逻辑分类,Partition 提供并行和有序日志 |
| Broker | Kafka 服务节点,存储分区副本 |
| Consumer Group | 组内分摊分区,组间广播消费 |
topic order has 3 partitions
P0 leader on broker1
P1 leader on broker2
P2 leader on broker3
consumer group A: each partition consumed by one member
Kafka 的核心是“分区日志”:分区内有序,分区间并行。
- 误区:Kafka 的 Topic 全局有序。 Kafka 只保证单个 Partition 内有序,Topic 多分区无法天然全局有序。
- 误区:消费者组里一个分区能被多个消费者同时消费。 同一消费组内,一个分区同一时刻只能分配给一个消费者。
- 误区:副本越多吞吐越高。 副本提升可靠性,但复制会增加网络和磁盘开销。
- 追问:Leader/Follower 副本如何工作? 读写通常走 Leader,Follower 从 Leader 拉取复制数据。
- 追问:Offset 是什么? Offset 是分区日志中的位置,消费者用它记录消费进度。
- 追问:为什么 Partition 能提升吞吐? 分区把日志拆到多 broker 和多消费者上,实现存储和消费并行。
七、加强记忆
Kafka 架构 = Producer 发、Broker 集群存、Consumer 收,消息按 Topic 分类。每个 Topic 分多个 Partition(并行 + 存储单位,分区内有序、分区间无序),分区内消息用 Offset(递增编号)标识位置和消费进度。分区有多副本:Leader 读写、Follower 同步,ISR 是同步副本集合(Leader 挂了从 ISR 选新 Leader,保高可用)。Consumer Group 实现「组内分摊消费(一分区只被组内一消费者消费,故消费者数 ≤ 分区数)+ 组间广播(不同组各自消费全量)」,成员变化触发 Rebalance。老版用 ZooKeeper 管元数据、新版转 KRaft。记忆锚点:Topic 分区、Offset 定位、Leader/ISR 保可用、消费者组分摊+广播。