Kafka源码解析(五)- 发送数据流程(3)
本节,浅析Sender线程拉去元数据过程
元数据是由Sender线程来完成的,首先找到Sender线程的run()方法


这里我们看到,Sender线程运行起来之后,第一件干的事就是 从Metadata里面获取Cluster对象,也就是集群元数据信息。但是假如代码第一次进来,获取到的Cluster是没有数据的,
由于Cluster里面没有集群的元数据,下面的一系列判断都不成立,直接跳到这个方法的最后一行。

这个是初始化生产者时候初始化的网络组件NetworkClient,建立连接的代码,找到NetworkClient 实现类里面的poll 方法

handleCompletedReceives 方法里面是处理元数据相关的响应

maybeHandleCompletedReceive 找到这个方法的实现类,DefaultMetadataUpdater

handlerResponse点进去。终于找到想看到的代码了,这里从服务端的响应里面获取集群的元数据对象Cluster,如果拉取到了,就会更新MetaData对象

metadata.update 是更新元数据的操作,点进去看一下

这里面注意到,在更新完元数据之后,有个notifyAll();,唤醒其他正在等待的线程。就是这里,正对应了上一节看到的同步等待拉取元数据时候的wait(remainingWaitMs);

至此,sender线程更新元数据的过程结束,与上一节同步等待拉取元数据相互照应。

浙公网安备 33010602011771号