Kafka源码解析(三)- 发送数据流程(1)

这一节,介绍下发送的流程

回到examples 包里面的生产者例子中,在初始化好生产者后,就要调用send方法发送数据了。

一直点到doSend 方法,这里面就是准备发送数据的流程了,一共分为八个步骤。

步骤一:等待更新元数据,要想发送数据,肯定要知道集群元数据信息,waitOnMetadata 方法返回的 clusterAndWaitTime.cluster 就是当前集群的元数据信息。

步骤二:对消息的key和value进行序列化

步骤三:为消息指定,要发送到哪个分区里面。

步骤四:确认一下消息的大小是否超过了最大值,还记得初始化生产者的时候 maxRequestSize 这个参数吗?如果超过了最大消息的大小,是发送不成功的
当然这里面除了消息本身大小,还加了12个字节:int serializedSize = Records.LOG_OVERHEAD + Record.recordSize(serializedKey, serializedValue);

步骤五:封装分区对象

步骤六:我们采用的是异步发送的方式,所以要为消息绑定回调函数

步骤七:把消息放入RecordAccumulator对象中,这个是我们初始化生产者的时候就初始化好的,批次对象。

步骤八:唤醒sender线程,真正发送数据是由sender线程来发送的。这个sender线程在初始化生产者的时候就初始化好并且start了起来
这里面有一个条件:result.batchIsFull || result.newBatchCreated。batchIsFull 指批次已经满了,newBatchCreated 指创建了一个新的批次,其实是一回事。

下一节开始细细解读,每个步骤里面都做了什么事。

posted @ 2020-09-05 23:24  写写代码睡着了  阅读(14)  评论(0)    收藏  举报