【生产者篇】 KafkaProducer发送消息简要流程

Kafka的Producer客户端就是完成将消息发送到Kafka服务器。完成这个功能只需要使用KafkaProducer的send方法即可。其内部原理是由两个线程共同完成,主线程和sender线程。sender线程是主线程的守护线程。主线程负责创建消对象,并将消息放在缓存,sender线程从缓存取出消息然后进行网络发送。

简要流程分析:

【生产者篇】 KafkaProducer发送消息简要流程_第1张图片

主线程:

1、封装消息对象,ProducerRecord,然后调用send方法

2、然后进入producer拦截器

3、更新KafkaCluster数据

4、序列化,将消息对象序列化成byte数组

5、分区器计算分区

6、将消息追加到缓存RecordAccumulator。

关于RecordAccumulator的简要说明:

追加到RecordAccumulator时候会对消息进行分类,发往同一分区的消息会被装在同一个Deque中,Deque存放的是ProducerBatch表示一组消息。

也就是RecordAccumulator会按照分区进行队列维护。队列中存放的是发往该分区的消息组,追加消息时候从队列的尾部追加,RecordAccumulator的大小默认32M,可以通过buffer . memory进行配置指定,如果内存空间用完了,追加消息将发生阻塞直到有空间可用为止,默认最大阻塞60s,可以通过数max.block.ms配置。关于RecordAccumulator的内容会专门深入分析。

sender线程:

sender线程在KafkaProduer实例化结束开启,在核心构造方法中,详细见源码注释。注释版源码下载:

1、sender线程将消息从RecordAccumulator中取出处理消息格式。

2、构建发送的请求对象Request

3、将请求交给Selector,并将请求存放在请求队列。

4、收到响应就移除请求队列的请求,调用每个消息上的回调函数。

注意:InFlightRequests就是请求队列,内部为了发往每个broker的请求的Deque,Deque中存放的是未响应请求,其中最大值默认5,可以通过max.in.flight.requests.per.connection进行配置。

这只是简要流程,尤其是sender发送消息的网络层,流程是非常复杂的。后面都会一一详细分析。

,尤其是sender发送消息的网络层,流程是非常复杂的。后面都会一一详细分析。

你可能感兴趣的:(Kafka,kafka2.0,源码分析)