学习rocketMQ时想到了一个问题,如果partition扩展了怎么办?旧partition的数据是否需要迁移?(这个问题后来想了想,并不需要,不是redis一致性哈希加节点需要迁移数据)
这次问题是倒推的,也和大家分享一下我的倒推逻辑

1、首先定位到生产者确定partition的代码

KafkaProducer#doSend(ProducerRecord<K, V> record, Callback callback)

定位到这个代码 只需通过kafkaTemplate.send一点点点进来就可以了~


kafka查看分区offset kafka查看partition_赋值


kafka查看分区offset kafka查看partition_赋值_02


可以看到,partition的信息是从cluster取出来的,那么cluster是从哪里来的呢?

就是代码中waitOnMeta方法2、waitOnMeta方法:

kafka查看分区offset kafka查看partition_构造方法_03


kafka查看分区offset kafka查看partition_构造方法_04


kafka查看分区offset kafka查看partition_kafka_05

这个方法一进来就看到,cluster信息是从metadata.cache.clusterInstance里获取的,ok继续往上找,这个metadata从哪里来的呢?

直接找到的属性,查看调用路径,我们发现 只有一个地方赋值了

kafka查看分区offset kafka查看partition_kafka_06


这个赋值的地方在哪呢?就是在KafkaProducer的构造方法里!

kafkaProducer对象在我们调用kafkaTemplate的时候就会创建

kafka查看分区offset kafka查看partition_赋值_07

3、KafkaProducer构造方法及metadata构建

kafka查看分区offset kafka查看partition_赋值_08


metadata.cache的赋值就在bootstrap中

kafka查看分区offset kafka查看partition_构造方法_09


kafka查看分区offset kafka查看partition_赋值_10


kafka查看分区offset kafka查看partition_赋值_11


kafka查看分区offset kafka查看partition_kafka_12


kafka查看分区offset kafka查看partition_kafka_13

kafka查看分区offset kafka查看partition_构造方法_14

唉???这走了一圈怎么partition信息还是空?那这个分区信息什么时候设置的呢?

理性分析,是不是最开始fetch的时候没数据,又去请求了一次服务器?

别急,让我们回到最开始的图

KafkaProducer#waitOnMetadata方法中:

kafka查看分区offset kafka查看partition_kafka_15

4、通过上图我们大致清楚了,在这个循环里会去获取kafka的分区信息
主要是sender线程的作用

后续我们看一下sender线程的代码