訊息在通過send()方法發往broker的過程中,有可能需要經過***(interceptor)、序列化器(serializer)和分割槽器(partitioner)的一系列作用之後才能被真正地發往 broker
如果訊息producerrecord中沒有指定partition欄位,那麼就需要依賴分割槽器,根據key這個欄位來計算partition的值。分割槽器的作用就是為訊息分配分割槽。
kafka中提供的預設分割槽器是org.apache.kafka.clients.producer.internals.defaultpartitioner,它實現了
其中partition()方法用來計算分割槽號,返回值為int型別。partition()方法中的引數分別表示主題、鍵、序列化後的鍵、值、序列化後的值,以及集群的元資料資訊,通過這些資訊可以實現功能豐富的分割槽器。close()方法在關閉分割槽器的時候用來**一些資源。其中如果 key 不為 null,那麼預設的分割槽器會對 key 進行雜湊(採用murmurhash2演算法,具備高運算效能及低碰撞率),最終根據得到的雜湊值來計算分割槽號,擁有相同key的訊息會被寫入同乙個分割槽。如果key為null,那麼訊息將會以輪詢的方式發往主題內的各個可用分割槽。
分割槽策略分為兩種,一種是預設分割槽策略
另一種是自定義分割槽:
Kafka分割槽策略及自定義
預設分割槽策略是 取正 bytearray生成32位hash值 numpartitions 這個公式的結果是得到0 numpartitions 1 間正整數的個數大致相等,也就是說kafka的預設分割槽策略是無論我們給定多少個分割槽,我們存放的資料基本上會平均的分到各個分割槽上。private in...
kafka消費分割槽策略
在 kafka 實際生產過程中,每個 topic 都會有 多個 partitions。1.多個partitions有什麼好處?1 多個 partition 能夠對 broker 上的資料進行分片,通過減少訊息容量來提公升 io 效能 2 為了提高消費端的消費能力,一般情況下會通過多個 conusme...
kafka傳送訊息分割槽策略詳解
背景 乙個簡單的用scala往kafka裡寫資料demo,每次執行只往乙個分割槽寫入資料,下次執行又選另乙個分割槽一直寫入。傳送例子 def main args array string unit 原因探索 keyedmessage有兩種例項化方式導致 def this topic string m...