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数据。