← 每日面试题 学习看板

Kafka 为什么有 Topic 还要用 Partition?

面试题/03数据库中间件/06MQ/01Kafka/Kafka 为什么有 Topic 还要用 Partition?.md

面试记录 2026-09-22

题目:Kafka 为什么有 Topic 还要用 Partition?

难度:medium

标签:db/mq/kafka, mq/kafka, general/knowledge, difficulty/medium

评分:⭐⭐⭐☆☆(3/5)

我的回答

为什么要设计一个分区呢?其实就是横向扩展的能力,因为 Kafka 的消息在 Topic 上其实是属于不同分区的,它其实是为了解决单机性能瓶颈问题,因为消息在单机上面存储的话,在消息过多,或者读写传输都会变得困难。因为单机磁盘读写都会有瓶颈,单机消息越多,其实读写都会比较困难,所以说引入了分区,其实就是为了提升横向扩展能力和性能的提升。

点评

优点:

不足:

补充(分区真正的四大作用):

  1. 并行度上限:一个 Consumer Group 内,一个 Partition 只能被一个消费者消费,分区数决定了消费者的最大并行度
  2. 顺序保证:Partition 内消息严格有序,但跨 Partition 无序
  3. 横向扩展:分区可分布在不同 Broker 上,水平扩展写入/存储/读取能力
  4. 容错隔离:不同分区有独立的副本,Broker 故障时只影响对应分区的 Leader

完整讲解

第一部分:知识重点剖析

核心考点定位:考察是否理解 Kafka 分区设计的动机——不只是一个概念,而是"如何用分区实现高吞吐 + 局部有序 + 横向扩展"的完整设计权衡。

知识点拆解:

  1. 单一 Partition 的瓶颈:
  1. 分区的核心作用:
  1. Partition 数量的权衡:
  1. Partition Key 的作用:hash(key) % numPartitions 决定路由;同一 Key 一定落同一分区,保证同一业务实体的顺序
  2. 消费者组与分区的硬约束:
Topic 是业务语义的容器,Partition 是物理上并行处理的单位。

第二部分:考察方向与延伸递进

考察方向:

延伸递进面试题:

  1. Kafka 分区只能增加不能减少,为什么?如果分区多了怎么办?
  1. 同一订单要保证顺序消费,分区数应该设多少?
  1. Topic 有 20 个分区,消费者组只有 5 个消费者,每个消费者会分到几个分区?

第三部分:面试者参考回答(300-600 字口语化)

面试官您好,Kafka 之所以在 Topic 之下再引入 Partition,核心是解决四个问题。

第一个是并行度。Kafka 的顺序写盘和消费者单分区消费都决定了单分区是有性能天花板的,加 Partition 就能让多个 Broker 并行写、多个消费者并行读,这是分区最本质的价值——决定了一个消费者组最大能有多少消费者同时工作。

第二个是顺序性。Kafka 保证的是"分区内有序",同一 Partition 内消息 offset 严格递增。业务上通常用 Partition Key 来路由,比如 hash(orderId) % numPartitions,同一订单一定落同一分区,从而实现"同一业务实体的顺序消费",全局则不保证有序。

第三个是横向扩展。Partition 可以分布在不同 Broker 上,扩容时加 Broker 加 Partition 就能线性扩展吞吐和存储。

第四个是容错隔离。每个 Partition 有自己的副本(ISR),某个 Broker 挂掉只会影响它上面的 Partition Leader,其他 Partition 继续服务,故障被隔离。

当然分区也不是越多越好:分区多了 Rebalance 频率上升,元数据管理开销大,文件句柄也容易爆。经验做法是按单分区单消费者的 QPS 上限反推,一般不超过 100。


面试记录 2026-10-12(第 2 次)

题目:Kafka 为什么有 Topic 还要用 Partition?

难度:medium

标签:db/mq/kafka, mq/kafka, difficulty/medium

评分:⭐⭐⭐⭐☆(4/5)

练习次数:2

我的回答

Topic 是主题,主要是相当于订阅业务方面的层面的信息。而 Partition 是分区,是为了承载更高并发量而做的类似于分布式逻辑的承载更多并发的物理机构。

二者定位的逻辑就是不一样的。Topic 是业务层面的,Partition 是物理层面的。Partition 解决的是并发量跟数据量的问题。

点评

优点:

不足:

补充:

ℹ️ 完整讲解见上方首次记录(2026-09-22)