kafka消息分區機制原理

背景

kafka如何支撐海量消息的集中寫入?java

答案就是消息分區。node

核心思想是:負載均衡,採用合適的分區策略把消息寫到不一樣的broker上的分區中;程序員

其它的產品中有相似的思想。算法

好比monogodb, es 裏面叫作 shard;   hbase叫region,  cassdra叫vnode;apache

消息的三層結構

以下圖:編程

即  topic -> partition -> message ;負載均衡

image.png

topic是邏輯上的消息容器;dom

partition實際承載消息,分佈在不一樣的kafka的broke上;性能

message即具體的消息。學習

分區策略

round-robin輪詢

image.png

消息按照分區挨個的寫。

randomness隨機分區

隨機的找一個分區寫入,代碼以下:

List<PartitionInfo> partitions = cluster.partitionsForTopic(topic);
return ThreadLocalRandom.current().nextInt(partitions.size());

image.png

key

相同的key的消息寫到固定的分區中

image.png

自定義分區

必須完成兩步:

1,自定義分區實現類,須要實現org.apache.kafka.clients.producer.Partitioner接口。

主要是實現下面的方法:

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

好比按照區域分區。

List<PartitionInfo> partitions = cluster.partitionsForTopic(topic);
return partitions.stream().filter(p -> isSouth(p.leader().host()))
    .map(PartitionInfo::partition).findAny().get();

2,顯示配置生產者端的參數partitioner.class爲具體的類

系統默認:若是消息有key,按照key分區策略,不然按照輪詢策略。

小結

kafka的分區實現消息的高吞吐量的主要依託,主要是實現了寫的負載均衡。能夠指定各類負載均衡算法。
負載均衡算法很是重要,須要極力避免消息分區不均的狀況,可能給消費者帶來性能瓶頸。

小結以下:

image.png

原創不易,點贊關注支持一下吧!轉載請註明出處,讓咱們互通有無,共同進步,歡迎溝通交流。
我會持續分享Java軟件編程知識和程序員發展職業之路,歡迎關注,我整理了這些年編程學習的各類資源,關注公衆號‘李福春持續輸出’,發送'學習資料'分享給你!

相關文章
相關標籤/搜索