CC00024.kafka——|Hadoop&kafka.V09|——|kafka.v09|生产者原理剖析.v01|

本文深入探讨了Kafka生产者的内部工作原理,包括主线程如何通过RecoderAccumulator和ProducerBatch实现消息的批量处理,以及Sender线程如何将消息转化为请求并发送到Broker节点。重点讲解了消息缓存、内存管理和负载均衡策略,揭示了Kafka高吞吐量和低延迟的设计思路。
摘要由CSDN通过智能技术生成
一、原理剖析

 

### --- [kafka高级特性解析]

~~~     [生产者原理剖析]
~~~     [生产者参数配置]
二、原理剖析
### --- 由上图可以看出:KafkaProducer有两个基本线程:

~~~     # 主线程:
~~~     负责消息创建,拦截器,序列化器,分区器等操作,并将消息追加到消息收集器RecoderAccumulator中;
~~~     消息收集器RecoderAccumulator为每个分区都维护了一个Deque<ProducerBatch> 类型的双端队列。
~~~     ProducerBatch 可以理解为是 ProducerRecord 的集合,批量发送有利于提升吞吐量,降低网络影响;
~~~     由于生产者客户端使用 java.io.ByteBuffer 在发送消息之前进行消息保存,
~~~     # 并维护了一个 BufferPool 实现 ByteBuffer 的复用;
~~~     该缓存池只针对特定大小batch.size 指定ByteBuffer进行管理对于消息过大的缓存,不能做到重复利用。
~~~     每次追加一条ProducerRecord消息,会寻找/新建对应的双端队列,从其尾部获取一个ProducerBatch,
~~~     判断当前消息的大小是否可以写入该批次中。

~~~     # 若可以写入则写入;若不可以写入,则新建一个ProducerBatch,
~~~     判断该消息大小是否超过客户端参数配置 batch.size 的值,不超过,
~~~     则以 batch.size建立新的ProducerBatch,这样方便进行缓存重复利用;
~~~     若超过,则以计算的消息大小建立对应的ProducerBatch ,缺点就是该内存不能被复用了。
### --- Sender线程:

~~~     该线程从消息收集器获取缓存的消息,将其处理为 <Node, List<ProducerBatch>的形式, 
~~~     Node 表示集群的broker节点。
~~~     进一步将<Node, List<ProducerBatch>转化为<Node, Request>形式,
~~~     此时才可以向服务端发送数据。在发送之前,
~~~     Sender线程将消息以 Map<NodeId, Deque<Request>> 的形式保存到 InFlightRequests 中进行缓存,
~~~     可以通过其获取 leastLoadedNode ,即当前Node中负载压力最小的一个,以实现消息的尽快发出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yanqi_vip

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值