-
當指定 key 且不為空的時候,kafka 是根據 key 的 hash 值與分區數取模來決定數據存儲到那個分區
-
當 key=null 時,kafka 是先從緩存中取分區號,然后判斷緩存的值是否為空,如果不為空,就將消息存到這個分區,否則重新計算要存儲的分區,並將分區號緩存起來,供下次使用
-
kafka 定義了一 個全局變量, 這個變量值是配置參數中的topic.metadata.refresh.interval.ms 設置的值,也就是說在這個時間內,key=null 的消息都會往緩存起來的這個分區存儲,當時緩存過時之后,就會重新計算分區號,將計算結果緩存起來。也就是說在key為null的情況下,Kafka並不是每條消息都隨機選擇一Partition;而是每隔 topic.metadata.refresh.interval.ms 才會隨機選擇一次!