Kafka 的 Topic 和 Partition 是什么?
Kafka
分布式系统
消息队列
什么是 Topic?
Topic 是 Kafka 中最基础的消息组织方式,我们可以把它理解为一个消息的集合或者一个消息队列。打个比方,如果把 Kafka 比作一个超市,Topic 就像是超市里的一个个货架,每个货架上存放着不同类型的商品(消息)。
Partition 是什么?
每个 Topic 可以分成若干个 Partition,就像把一个大货架分成了好几层。这样做有几个明显的好处:
- 提升并行能力 - 就像多个收银员同时工作
- 分散存储压力 - 就像把商品分散在不同的仓库
- 提高吞吐量 - 好比多开几个通道,顾客进出更快
Partition 的存储模式
Topic: "订单消息"
├── Partition 0: [订单1] -> [订单2] -> [订单3]
├── Partition 1: [订单4] -> [订单5] -> [订单6]
└── Partition 2: [订单7] -> [订单8] -> [订单9]
每条消息进入 Partition 后,都会获得一个唯一的序号(offset
),就像排队取号一样,这个号码就是消息的"身份证"。
Partition 的备份机制
为了数据安全,Kafka 会为每个 Partition 创建多个副本:
- Leader 副本 - 主副本,负责处理所有的读写请求
- Follower 副本 - 从副本,负责同步数据,在主副本故障时提供故障转移
Partition 0
├── Leader (服务器 1)
├── Follower (服务器 2)
└── Follower (服务器 3)
生产者的分配策略
- 轮流分配 - 像发扑克牌一样,轮流发给每个 Partition
- 按 Key 分配 - 同类消息发到同一个 Partition
- 自定义分配 - 根据业务需求自己决定分配规则
消费者如何读取 Partition?
消费者组中的每个消费者会负责读取一部分 Partition,主要有以下几种分配方式:
- 范围分配(Range) - 将连续的 Partition 分配给消费者,类似于把一条生产线分段管理
- 轮询分配(RoundRobin) - 轮流将 Partition 分配给消费者,确保分配均匀
- 粘性分配(Sticky) - 尽可能保持现有的分配关系,减少 rebalance 带来的开销
实战建议
-
如何设置 Partition 数量?
- 评估消息量的大小
- 考虑服务器的承载能力
- 经验公式:Partition 数量 = 预期每秒消息量 / 单个 Partition 处理能力
-
使用注意事项
- Partition 不是越多越好,每个 Partition 都会占用系统资源
- Partition 数量设定后不建议减少,可以增加
- 太多 Partition 会增加故障风险
-
重要监控指标
- 消息堆积情况
- 副本同步状态
- 各个 Partition 的负载是否均衡
小结
在实际项目中,建议根据具体的业务场景和性能要求,合理规划我们的 Topic 和 Partition 结构。
前往消息队列必知必会,练习更多 Kafka 相关的面试题。