学习rocketMQ时想到了一个问题,如果partition扩展了怎么办?旧partition的数据是否需要迁移?(这个问题后来想了想,并不需要,不是redis一致性哈希加节点需要迁移数据)
这次问题是倒推的,也和大家分享一下我的倒推逻辑
1、首先定位到生产者确定partition的代码
KafkaProducer#doSend(ProducerRecord<K, V> record, Callback callback)
定位到这个代码 只需通过kafkaTemplate.send一点点点进来就可以了~
可以看到,partition的信息是从cluster取出来的,那么cluster是从哪里来的呢?
就是代码中waitOnMeta方法2、waitOnMeta方法:
这个方法一进来就看到,cluster信息是从metadata.cache.clusterInstance里获取的,ok继续往上找,这个metadata从哪里来的呢?
直接找到的属性,查看调用路径,我们发现 只有一个地方赋值了
这个赋值的地方在哪呢?就是在KafkaProducer的构造方法里!
kafkaProducer对象在我们调用kafkaTemplate的时候就会创建
3、KafkaProducer构造方法及metadata构建
metadata.cache的赋值就在bootstrap中
唉???这走了一圈怎么partition信息还是空?那这个分区信息什么时候设置的呢?
理性分析,是不是最开始fetch的时候没数据,又去请求了一次服务器?
别急,让我们回到最开始的图
KafkaProducer#waitOnMetadata方法中:
4、通过上图我们大致清楚了,在这个循环里会去获取kafka的分区信息
主要是sender线程的作用
后续我们看一下sender线程的代码