1. 程式人生 > >kafka訊息分割槽機制原理

kafka訊息分割槽機制原理

背景

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

答案就是訊息分割槽。

核心思想是:負載均衡,採用合適的分割槽策略把訊息寫到不同的broker上的分割槽中;

其它的產品中有類似的思想。

比如monogodb, es 裡面叫做 shard;   hbase叫region,  cassdra叫vnode;

訊息的三層結構

如下圖:

即  topic -> partition -> message ;

topic是邏輯上的訊息容器;

partition實際承載訊息,分佈在不同的kafka的broke上;

message即具體的訊息。

分割槽策略

round-robin輪詢

訊息按照分割槽挨個的寫。

randomness隨機分割槽

隨機的找一個分割槽寫入,程式碼如下:

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

key

相同的key的訊息寫到固定的分割槽中

自定義分割槽

必須完成兩步:

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的分割槽實現訊息的高吞吐量的主要依託,主要是實現了寫的負載均衡。可以指定各種負載均衡演算法。
負載均衡演算法非常重要,需要極力避免訊息分割槽不均的情況,可能給消費者帶來效能瓶頸。

小結如下:

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