Kafka消息分區

Kafka消息分區

分區模型

之前我們提到,Kafka 裡面同一個 Topic 下面的消息,會存放在多個分區上面。每條消息在添加到分區時,都會被分配一個 offset,它是消息在此分區中的唯一編號。Kafka 通過 offset 保證消息在分區內的順序,在多個分區之間並不保證消息是有序的。

Kafka消息分區

Kafka 的分區能力,其實就是提供了消息負載均衡的能力。當消息存量的負載較高時,可以通過水平擴展來平滑壓力。

分區策略

這裡的分區策略,就是說生產者如何決定將一個消息發送到哪個分區上面去。對於Java 的客戶端來說,確定分區的方法簽名如下:

 partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster);

可以看出客戶端提供了多種參數的原料,用來加工生成結果的分區ID。下面看一下常見的分區策略。

輪詢策略

輪詢策略(Round-robin),顧名思義就是在每個 Partition 上面平均的分配 Topic 下面的消息,如下圖所示:

Kafka消息分區

輪詢策略可以做到嚴格意義上的平均,默認情況下也是最合理的分區策略。

隨機策略

隨機策略(Randomness),也就是生產出來一條消息後,隨機的分發到一個 Partition 上面。在數據較多時,從概率統計上面來說,最終各個分區的數據量會相差不大,但是並不是嚴格均等的。

Kafka消息分區

從總體上面,隨機和輪詢策略大致是相同的。但是在新版本的 Kafka 裡面已經使用輪詢來替代隨機策略了。

key-ordering 策略

Kafka 可以為每條消息指定一個 key,這個 key 可以是 userId、productId 等等。如果一個消息指定了 key ,就可以將同樣 key 的消息存放在同一個 Partition 裡面,這就是 key-ordering 策略。如下所示:

Kafka消息分區

對於Kafka 默認的分區策略:如果沒有指定 key,則按照輪詢的方式指定 Partition;如果指定了 key,則以key-ordering 策略指定。

其他策略

在實際應用當中,可能會跨機房的 Kafka 集群,這個時候如果要針對不同機房的節點發送不同的消息。此時可能會需要按照 IP 的方式做分區了。

參考:《極客時間:Kafka核心技術與實戰》、《Kafka源碼剖析》


分享到:


相關文章: