生产者客户端架构
客户端客户端由mian 线程和 sender 线程协调运行。
主线程有 kafkaProducer 创建消息,通过拦截器、序列化器和分区器处理之后缓存到消息累加器(recordAccumular)。
RecordAccumular 用来缓存消息以便 Sender 线程批量发送,进而减少网络传输提升性能。RecordAccumular 通过 buffer.memory配置缓存大小,默认值 32MB。主线程发送过来的消息追加到 RecordAccumular 的某个分区的双端队列,队列中存储 ProducerBatch,即 Deque<ProducerBatch>。
ProcucerBatch 包含一个或者多个 ProducerRecord,也可以减少网络的请求次数提升整体吞吐量。也可以适当增加 buffer.memory的整体吞吐量。
Sender 从RecordAccumular 获取到消息,将原本<分区,Deque<ProducerBatch>>转换成<Node,List<ProducerBatch>>,Node代表 Kafka broker 节点。Sender 再次将数据转换成<Node,Request>,将 request 请求发给各个 Node.
Request 从 Sender 发送给 Kafka broker 之前 保存在 InFlightRequests,缓存了已经发送但还没有接受到响应的请求,在其中保存形式 Map<NodeId,Deque<Request>>。其中还管理限制请求数量,参数max.in.flight.requests.per.connection,默认值=5,最多只能缓存 5个未响应的请求,超过这个值就不再向这个 Node 发送更多的数据,也说明这个节点负载较大或者出现网络问题。