kafka的key为null时如何存储
kafka producer發送消息的時候,可以指定key,這個key的作用是為消息選擇存儲分區,key可以為空,當指定key且不為空的時候,kafka是根據key的hash值與分區數取模來決定數據存儲到那個分區,那么當key為null的時候,kafka又是如何存儲的呢?可能很多人都會說隨機選擇一個分區進行存儲,但是具體是怎么實現的呢?雖然可以這么說,但是還不夠嚴謹,下面通過kafka的源碼來解讀下key=null是怎么存儲的:
從上面源碼可以看出,當key=null時,kafka是先從緩存中取分區號,然后判斷緩存的值是否為空,如果不為空,就將消息存到這個分區,否則重新計算要存儲的分區,并將分區號緩存起來,供下次使用。
那么這個緩存時間是由什么決定呢,再來看下源碼:
從上面源碼可以看出,kafka定義了一個全局變量,這個變量值是配置參數中的topic.metadata.refresh.interval.ms設置的值,也就是說在這個時間內,key=null的消息都會往緩存起來的這個分區存儲,當時緩存過時之后,就會重新計算分區號,將計算結果緩存起來。也就是說在key為null的情況下,Kafka并不是每條消息都隨機選擇一個Partition;而是每隔topic.metadata.refresh.interval.ms才會隨機選擇一次!
sarama指定key代碼:
關于key和分區
在創建消息時既可以指定key也可以不指定。Key除了可以保存額外的信息之外,還用于決定消息將會寫入哪個分區,也就是說具有相同key的消息都會保存在同一分區。
當key為空且使用默認的分區器時,消息會被隨機發送到指定topic的其中一個可用分區,會使用round-robin算法均衡分區間的消息。
當key不為空且使用默認的分區器時,Kafka會計算該key的hash值(使用其自己的hash算法,因此當升級Java版本時hash值不會改變),并使用得到的hash值把消息映射到特定的分區。因為把一個key始終映射到同一分區是非常重要的,所以需要使用一個topic的所有分區來計算映射關系,而不僅僅是可用的分區。這意味著,如果當寫入消息到一個不可用的分區時,會出現異常,但是這種情況很少見。
只要一個topic的分區數量不變,key與分區的映射關系就能保證一致。但是如果你添加一個新的分區到一個topic時,雖然存在的數據仍然會保存在原來的分區里,但具有相同key的新消息不能保證還會寫入到原來的分區。所以在創建topic時最好預先定義好需要的分區數量,避免后期添加新的分區造成映射關系的不一致。
總結
以上是生活随笔為你收集整理的kafka的key为null时如何存储的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里云监控插件安装 | 非阿里云服务器安
- 下一篇: kafka集群管理工具kafka-man