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

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

简要流程分析:

发送消息流程简图

主线程:

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发送消息的网络层,流程是非常复杂的。后面都会一一详细分析。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值