认真读完这篇文章,我相信你会对 Kafka 生产初始化源码有更加深刻的理解。
这篇文章干货很多,希望你可以耐心读完。
01 总体概述
我们都知道在 Kafka 中,我们把产生消息的一方称为生产者即 Producer,它是 Kafka 核心组件之一,也是消息的来源所在。那么这些生产者产生的消息是如何传到 Kafka 服务端的呢?初始化过程是怎么样的呢?接下来会逐一讲解说明。
02 生产者初始化核心组件及流程剖析
我们先从生产者客户端构造 KafkaProducer 开始讲起:
Properties properties = new Properties();
//构造 KafkaProducer
KafkaProducer producer = new KafkaProducer(properties);
//调用send异步回调发送
producer.send(record,new DemoCallBack(record.topic(), record.key(), record.value()));
上面代码主要做了2件事情:
1)初始化 KafkaProducer 实例 。
2)调用 send 接口发送数据,支持同步和异步回调方式 。
待构造完 KafkaProducer 就正式进入生产者源码的入口了,如下图所示:
接下来我们分析一下 KafkaProducer 的源码, 先看下该类里面的 「 重要字段 」 :
public class KafkaProducer<K, V> implements Producer<K, V> {
private final Logger log;
private static final String JMX_PREFIX = "kafka.producer";
public static final String NETWORK_THREAD_PREFIX = "kafka-producer-network-thread";
public static final String PRODUCER_METRIC_GROUP_NAME = "producer-metrics";
// 生产者客户端Id
private final String clientId;
// 消息分区器
private final Partitioner partitioner;
// 消息的最大的长度,默认1M,生产环境可以提高到10M
private final int maxRequestSize;
// 发送消息的缓冲区的大小,默认32M
private final long totalMemorySize;
// 集群元数据
private final ProducerMetadata metadata;
// 消息累加器
private final RecordAccumulator accumulator;
// 执行发送消息的类
private final Sender sender;
// 执行发送消息的线程
private final Thread ioThread;
// 消息压缩类型
private final CompressionType compressionType;
// key的序列化器
private final Serializer<K> keySerializer;
// value的序列化器
private final Serializer<V> valueSerializer;
// 生产者客户端参数配置
private final ProducerConfig producerConfig;
// 等待元数据更新的最大时间,默认1分钟
private final long maxBlockTimeMs;
// 生产者拦截器
private final ProducerInterceptors<K, V> interceptors;
// api版本
private final ApiVersions apiVersions;
// 事务管理器
private final TransactionManager transactionManager;
........
}
重要且核心字段含义如下:
1) clientId: 生产者客户端的ID。
2) partitioner: 消息的分区器,即通过某些算法将消息分配到某一个分区中。
3) maxRequestSize: 消息的最大的长度,默认1M,生产环境可以提高到10M。
4) totalMemorySize: 发送消息的缓冲区的大小,默认32M。
5) metadata: 集群的元数据。
6) accumulator: 消息累加器,主要负责缓冲消息。
7) sender: 执行发送消息的类型,主要负责发送消息。
8) ioThread: 执行发送消息的线程,主要负责封装Sender类。
9) compressionType: 消息压缩的类型。
10) keySerializer: key的序列化器。
11) valueSerializer: value的序列化器。
12) producerConfig :生产者客户端的配置参数。
13) maxBlockTimeMs: 等待元数据更新和缓冲区分配的最长时间,默认1分钟。
14) interceptors: 生产者拦截器。主要负责在消息发送前后对消息进行拦截和处理。
接下来我们看下KafkaProducer的构造方法,来剖析生产者发送消息的过程中涉及到的「核心组件」。
源码位置: