Kafka生产者-内部原理

整体架构

流程分析

生产者客户端由2个线程构成,分别为主线程和发送线程,主线程中KafkaProducer创建消息,经过拦截器序列化器分区器之后,缓存到消息累加器,然后发送线程从消息累加器中获取消息并将其发送到Kafka中

累加器主要的作用是缓存消息,让发送线程可以批量发送,减少网络传输资源消耗提升性能,缓存大小可以通过buffer.memory配置,默认值为32MB,如果生产者发送消息的速度超过发送到服务器的速度,则send()方法要么被阻塞,要么抛出异常,取决于参数max.block.ms,默认值为60000ms

主线程发送的消息被追加到消息累加器的一个双端队列中,消息累加器内部为每个分区都维护了一个双端队列,队列中是ProducerBatch,包含多个ProducerRecord

消息累加器中还有一个BufferPool实现ByteBuffer的复用

发送线程从消息累加器获取缓存的消息之后,将原来的<TopicPartition, Deque>形式转变成<Node,List>的形式,Node节点表示Kafka集群的broker节点,然后进一步封装成<Node,Request>形式,将请求发往各个Node

请求发送之前会保存到InFlightRequests中,具体形式为Map<NodeId,Deque>,主要作用是缓存已经发送出去但还没收到响应的请求,除此之外,还可以通过配置参数限制每个连接最多可以缓存的请求数,配置参数为max.in.flight.requests.per.connection,第三个作用是可以获得leastLoadedNode,即所有Node中负载最小的一个(未确认的请求越少则负载越少)

posted @ 2020-07-27 21:42  马晟  阅读(392)  评论(0编辑  收藏  举报