JJava 知识库
JAVA INTERVIEW

高频面试题

Kafka高级约 2 分钟

新建一个日均十亿消息的 Topic,分区数怎么估算?后续扩容有什么影响?

参考回答约 2 分钟 · 口语表达
我的判断

日均十亿消息的分区数要按峰值吞吐、单分区实测能力、消费者并行度和故障恢复时间共同估算,并留增长余量。

日均十亿约 1.16 万条/秒,但平均值没有用。我会拿峰值,例如 10 万条/秒、单条 1KB,再在目标副本、压缩和磁盘配置下压测单分区生产与消费能力。若单分区稳定处理 5MB/s,而峰值写入 100MB/s,理论至少 20 个,再考虑消费者并行、流量增长和单 Broker 分布,可能从 36 或 48 开始。

分区不是越多越好。更多分区意味着更多文件、复制连接、Leader 选举、controller 元数据和客户端缓冲,也会延长故障恢复。还要保证每个 Broker 的 Leader 和磁盘分布均匀。

扩分区容易,缩分区很难,而且默认 key hash 会因分区数变化改变映射,可能破坏同 key 顺序。设计时会为有序 Topic 留足余量,扩容前先清积压或做版本化 Topic 切换。

最终用峰值生产/消费速率、最慢分区 lag、Broker 资源和故障演练校正,不用“每个消费者一个分区”的单一公式。

思路拆解问题分析

容量估算至少有两个下限:写入吞吐需要的分区数消费 SLA 需要的并行度。取较大值后再检查 Broker 运维成本与顺序约束。