整体架构
流程分析
生产者客户端由2个线程构成,分别为主线程和发送线程,主线程中KafkaProducer创建消息,经过拦截器、序列化器、分区器之后,缓存到消息累加器,然后发送线程从消息累加器中获取消息并将其发送到Kafka中
累加器主要的作用是缓存消息,让发送线程可以批量发送,减少网络传输资源消耗提升性能,缓存大小可以通过buffer.memory配置,默认值为32MB,如果生产者发送消息的速度超过发送到服务器的速度,则send()方法要么被阻塞,要么抛出异常,取决于参数max.block.ms,默认值为60000ms
主线程发送的消息被追加到消息累加器的一个双端队列中,消息累加器内部为每个分区都维护了一个双端队列,队列中是ProducerBatch,包含多个ProducerRecord
消息累加器中还有一个BufferPool实现ByteBuffer的复用
发送线程从消息累加器获取缓存的消息之后,将原来的<TopicPartition, Deque
请求发送之前会保存到InFlightRequests中,具体形式为Map<NodeId,Deque