一、什么是 Partition
-
Partition(分区) 是 Kafka Topic(主题) 的最小并行单位。
-
一个 Topic 可以包含多个 Partition,每个 Partition 底层对应一个有序、不可变的消息队列,消息只会顺序追加。
-
Partition 内部消息都有一个唯一的偏移量(offset),消费者依靠 offset 来消费。
👉 关系:
Topic = Partition1 + Partition2 + ... + PartitionN
二、分区的作用
-
提高吞吐量(并行度)
-
单个 Partition 只能由一个 Consumer 实例顺序消费。
-
增加 Partition 数量,可以让更多消费者并行消费,提高消费能力。
-
同样,生产者发送时可以并行写入多个 Partition,提升写入吞吐量。
-
-
数据存储与扩展性
- Partition 分布在不同的 Broker 上,数据可以水平扩展,突破单机存储瓶颈。
-
容错与副本机制的基础
-
每个 Partition 都有 Leader 和 Follower 副本。
-
Leader 负责读写,Follower 同步 Leader 数据,用于故障切换。
-
三、分区的工作机制
-
生产者写入
-
生产者写消息时,需要决定写入哪个 Partition。
-
Kafka 提供三种分区策略:
-
轮询(Round-robin):平均分配到各个 Partition。
-
按 key 哈希(Key Hash):相同的 key 会被分配到同一个 Partition(保证消息顺序)。
-
自定义分区器 :可以自己实现
Partitioner
接口来决定分区逻辑。
-
-
-
消费者消费
-
一个消费者组中的每个 Partition 同一时刻只能被一个消费者消费。
-
Kafka 会自动做负载均衡,把 Partition 分配给组内消费者。
-
-
副本机制
-
每个 Partition 有一个 Leader 和若干 Follower。
-
Producer 和 Consumer 只和 Leader 交互。
-
Follower 定期从 Leader 同步数据,保证数据可靠性。
-
四、分区数的选择
分区数是 Topic 创建时的关键参数,影响系统性能和架构:
-
分区数过少:
- 无法充分利用集群并行能力,吞吐量有限。
-
分区数过多:
-
元数据管理开销变大(Zookeeper / KRaft 需要维护更多状态)。
-
Rebalance 时间变长。
-
消费者切换代价增加。
-
👉 一般经验:
-
分区数 = 生产者吞吐量 / 单分区最大处理能力。
-
或者分区数 = 消费者并行度。
-
Kafka 官方推荐:不要轻易创建上千分区,根据硬件能力做评估。
五、如何指定 Partition
生产者写入消息时,可以指定 Partition:
ProducerRecord<String, String> record = new ProducerRecord<>("my-topic", key, value);
规则:
-
如果指定了 partition 参数,则直接写入该 Partition。
-
如果指定了 key(但没有指定 partition),Kafka 根据 key 的哈希值选择 Partition。
-
如果都没指定,则轮询选择 Partition。
六、分区与顺序性
-
Kafka 只保证 同一个 Partition 内的消息有序。
-
不同 Partition 之间的消息是无序的。
-
如果业务要求消息严格有序,则必须让相关消息写入 同一个 Partition(通常通过 key 实现)。
七、实战:管理 Partition
1. 创建 Topic 时指定分区数
bin/kafka-topics.sh --create \ --bootstrap-server localhost:9092 \ --topic test-topic \ --partitions 4 \ --replication-factor 2
2. 查看 Topic 分区信息
bin/kafka-topics.sh --describe \ --bootstrap-server localhost:9092 \ --topic test-topic
输出示例:
Topic: test-topic PartitionCount: 4 ReplicationFactor: 2 Partition: 0 Leader: 1 Replicas: 1,2 Isr: 1,2 Partition: 1 Leader: 2 Replicas: 2,3 Isr: 2,3 Partition: 2 Leader: 3 Replicas: 3,1 Isr: 3,1 Partition: 3 Leader: 1 Replicas: 1,2 Isr: 1,2
3. 增加分区数
bin/kafka-topics.sh --alter \ --bootstrap-server localhost:9092 \ --topic test-topic \ --partitions 6
⚠️ 注意:增加分区数不会自动对现有消息做迁移,只影响新消息。
八、总结
-
Partition 是 Kafka 的核心并行单元。
-
作用:提升吞吐量、扩展存储、实现高可用。
-
分区内有序,跨分区无序。
-
分区数要合理规划,过少浪费性能,过多增加负担。
-
生产者可通过 key 控制分区,保证某些业务的顺序性。