KafkaProducer的metadata獲取過程
Metadata
生產者要獲得集群的元數據才能准確無誤地發送消息到對應的TopicPartition里面,獲取metadata是發送的第一步。
所以今天我們講metadata,那么首先看看metadata的對象。
Metadata的字段
主要都寫上了注釋,其中比較核心的是Cluster集群信息
Cluster
上面partition信息比較多,其實從這里就可以很清楚的了解到partition到底是什么東西了。
- Partition的單位是TopicPartition,每個TopicPartition都有關於自己的Partition信息。
- 每個Topic有多個Partition
- Cluster會記錄着每個Topic有哪些Partition是可用的,方便消費者發信息時使用。
PartitionInfo
PartitionInfo的字段清晰明了。
- leader:一個partition只有一個leader,leader是Node,也就是哪一個集群。
- replicas:也是followers。拷貝leader的數據,主要用於容災。
- inSyncReplicas:是ISR集合,只有和leader的數據在一定時間內追趕過leader才能進入該集合。
metadata的假獲取
在kafkaProducer初始化的時候,對metadata數據進行過update,但這次update是假更新。
不妨點進去看看。
cluster僅僅是在新建的 Cluter添加了bootstrap的配置信息,並無任何原參數信息。
真正的第一次獲取
可能你們會好奇kafkaprodecer啥時候才會進行元數據的獲取。
答案:是在第一次發送數據的時候。
我們不妨進入producer的send方法中。
send()
當配置了攔截器就會觸發攔截器的doSend方法,此處我們忽略,主要去看KafkaProducer的doSend方法。
doSend()
在發送信息的第一步,是確定有該topic的metadata。
waitOnMetadata()
如果有數據就直接返回。
同步等待獲取metadata數據。