Back to Knowledge Hub

    Kafka 的 Topic 和 Partition 是什么?

    Kafka
    分布式系统
    消息队列

    什么是 Topic?

    Topic 是 Kafka 中最基础的消息组织方式,我们可以把它理解为一个消息的集合或者一个消息队列。打个比方,如果把 Kafka 比作一个超市,Topic 就像是超市里的一个个货架,每个货架上存放着不同类型的商品(消息)。

    Partition 是什么?

    每个 Topic 可以分成若干个 Partition,就像把一个大货架分成了好几层。这样做有几个明显的好处:

    1. 提升并行能力 - 就像多个收银员同时工作
    2. 分散存储压力 - 就像把商品分散在不同的仓库
    3. 提高吞吐量 - 好比多开几个通道,顾客进出更快

    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)
    

    生产者的分配策略

    1. 轮流分配 - 像发扑克牌一样,轮流发给每个 Partition
    2. 按 Key 分配 - 同类消息发到同一个 Partition
    3. 自定义分配 - 根据业务需求自己决定分配规则

    消费者如何读取 Partition?

    消费者组中的每个消费者会负责读取一部分 Partition,主要有以下几种分配方式:

    1. 范围分配(Range) - 将连续的 Partition 分配给消费者,类似于把一条生产线分段管理
    2. 轮询分配(RoundRobin) - 轮流将 Partition 分配给消费者,确保分配均匀
    3. 粘性分配(Sticky) - 尽可能保持现有的分配关系,减少 rebalance 带来的开销

    实战建议

    1. 如何设置 Partition 数量?

      • 评估消息量的大小
      • 考虑服务器的承载能力
      • 经验公式:Partition 数量 = 预期每秒消息量 / 单个 Partition 处理能力
    2. 使用注意事项

      • Partition 不是越多越好,每个 Partition 都会占用系统资源
      • Partition 数量设定后不建议减少,可以增加
      • 太多 Partition 会增加故障风险
    3. 重要监控指标

      • 消息堆积情况
      • 副本同步状态
      • 各个 Partition 的负载是否均衡

    小结

    在实际项目中,建议根据具体的业务场景和性能要求,合理规划我们的 Topic 和 Partition 结构。

    前往消息队列必知必会,练习更多 Kafka 相关的面试题。