kafka 批量发送数据源码解析

本文详细解析了Kafka生产者客户端的数据发送流程,包括数据缓冲、RecordAccumulator、ProducerBatch的使用,以及定时和定量发送策略。通过源码分析,阐述了如何通过batch.size、linger.ms等参数实现批量发送,确保数据高效、低延迟地传输到Kafka服务端。
摘要由CSDN通过智能技术生成

一、生产者数据发送整体流程

kafka 生产者客户端核心的数据发送流程主要为三个部分:

  1. 主线程调用 KafkaProducer 发送数据,数据不是直接发送给 kafka broker 服务端,而是先缓冲起来。

  2. 有一个单独的线程(sender)专门负责将缓冲数据发往 kafka broker 服务端。

  3. 缓冲的目的是:为避免高并发请求造成的服务端压力,所以数据不是一条一条发给服务端,而是缓冲后批量发送。

  4. 单独线程负责数据发送的目的是:避免造成主线程发送数据时阻塞,造成核心业务响应延时。

我们来查一下 KafkaProducer,java 源码,其核心构造方法为:

KafkaProducer(Map<String, Object> configs,
              Serializer<K> keySerializer,
              Serializer<V> valueSerializer,
              ProducerMetadata metadata,
              KafkaClient kafkaClient,
              ProducerInterceptors<K, V> interceptors,
              Time time) {
            //1.记录累加器
            this.accumulator = new RecordAccumulator(……)
            //2. 数据发送线程
            this.sender = newSender(logContext, kafkaClient, this.metadata);
            String ioThreadName = NETWORK_THREAD_PREFIX + " | " + clientId;
            this.ioThread = new KafkaThread(ioThreadName, this.sender, true);
            this.ioThread.start();
}

我们只抽取了这个构造函数中的核心代码

  1. 记录累加器 RecordAccumulator,也就是生产者 KafkaProducer 生产的数据不是直接发送给 kafka broker。而是批量累加先放入 RecordAccumulator,然后分批次发送给 kafka broker。

  2. 数据发送有一个单独的线程来完成,这个线程为 sender,一个 KafkaProducer 对象对应一个 Sender 线程

从上面的源码可以部分验证我们对生产者数据整体流程的概括,后文会继续进行解析说明。

二、ProducerRecord 与 ProducerBatch 与 RecordAccumulator

上文我们提到了数据累加器,也就是数据缓冲区。下面我们就来深入学习一下数据缓冲区的构造,了解数据缓冲区的构造对于理解 kafka 整个架构都会有很大的帮助。下文是 RecordAccumulator 类定义的一个成员变量 batches。

public final class RecordAccumulator {
    ……
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

倾听铃的声

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

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

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

打赏作者

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

抵扣说明:

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

余额充值