一、什么是 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 控制分區,保證某些業務的順序性。