03. KafkaProducer 是如何从服务器获取元数据的原理分析


03. KafkaProducer 是如何从服务器获取元数据的原理分析

我们在使用KafkaProducer向kafka broker发送消息时候,我们都会有一个疑问producer是如何找到对应的topic的partition的leader所在的broker呢?本篇我们就来分析producer是如何从服务器获取topic的元数据信息。

我们在平时研发时一般向kakfa broker发送数据的过程,大概遵循以下步骤

其实最核心的就是第3步的send方法,接下来我们就通过分析send方法的源码,得出是如何获取元数据信息的。

send方法调用了doSend方法

通过调用waitOnMetadata方法去加载对应topic的的meta信息

第一步:由于第一次发送MetaData缓存里没有相应的topic,因此,把相应topic加入MetaData中

第二步:调用的requestUpdate方法将MetaData的needUpdate变量设置为true

第三步:调用Sender线程的wakeup方法触发Sender线程的执行。

第四步:调用awaitUpdate方法将自己阻塞一定时间,阻塞时间到期后接着去判断是否可以从meta的缓存中获取相应meta信息,如果还是不能获取到接着阻塞,知道超时抛出TimeoutException异常

接下来分析Sender是如何获取meta信息的

由于Sender是一个线程实现了Runnable接口,因此我们直接分析它的run方法如下

又调用了有参数的run方法如下

这个方法的代码比较多,我们直接看最后一行client.poll,其它行都是与发送数据相关的操作,poll方法代码如下

首先调用metadataUpdater.maybeUpdate方法判断是否需要更新meta缓存

调用maybeUpdate方法创建MetadataRequest请求,然后通过request方法创建了ApiKeys.METADATA的RequestSend,然后包装成ClientRequest,再接着调用doSend发送请求,其实也就是先加到了inFlightRequests的双端队列中,此时还没有真正的发送

接着分析上面poll方法中的this.selector.poll这行代码,这里是真正的向服务器发送请求和接受服务器返回结果的地方,poll代码如下

这里涉及到java nio的相关知识,不太熟徐java nio相关知识的同学,可以先去大概了解以下java nio编程,有助于自己将来照着源码分析的时候,理解代码是如何执行的,博客里知识捡最重要的步骤梳理

接下来看分析poll方法的handleCompletedReceives行这里是处理this.selector.poll从网络层接受到的数据

这里有一个判断是否是ApiKeys.METADATA请求的返回结果,如果是METADATA请求,直接将返回结果Cluster更新到metadata

调用MetaData的update方法设置元数据信息的同时,唤醒调用awaitUpdate获取topic meta信息的线程

自此,以上我们整体梳理了一下kafkaProducer是如何获取topic的元数据信息的

你可能感兴趣的:(03. KafkaProducer 是如何从服务器获取元数据的原理分析)