一、生产者数据发送整体流程
kafka 生产者客户端核心的数据发送流程主要为三个部分:
-
主线程调用 KafkaProducer 发送数据,数据不是直接发送给 kafka broker 服务端,而是先缓冲起来。
-
有一个单独的线程(sender)专门负责将缓冲数据发往 kafka broker 服务端。
-
缓冲的目的是:为避免高并发请求造成的服务端压力,所以数据不是一条一条发给服务端,而是缓冲后批量发送。
-
单独线程负责数据发送的目的是:避免造成主线程发送数据时阻塞,造成核心业务响应延时。
我们来查一下 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();
}
我们只抽取了这个构造函数中的核心代码
-
记录累加器 RecordAccumulator,也就是生产者 KafkaProducer 生产的数据不是直接发送给 kafka broker。而是批量累加先放入 RecordAccumulator,然后分批次发送给 kafka broker。
-
数据发送有一个单独的线程来完成,这个线程为 sender,一个 KafkaProducer 对象对应一个 Sender 线程。
从上面的源码可以部分验证我们对生产者数据整体流程的概括,后文会继续进行解析说明。
二、ProducerRecord 与 ProducerBatch 与 RecordAccumulator
上文我们提到了数据累加器,也就是数据缓冲区。下面我们就来深入学习一下数据缓冲区的构造,了解数据缓冲区的构造对于理解 kafka 整个架构都会有很大的帮助。下文是 RecordAccumulator 类定义的一个成员变量 batches。
public final class RecordAccumulator {
……