KafkaProducer是一个Kafka客户端实现,可以发布记录records至Kafka集群。KafkaProducer是线程安全的,多线程之间共享单独一个producer实例通常会比多个producer实例要快。KafkaProducer包含一组缓存池空间,存储尚未传输到集群的记录records,同时,一个后台的I/O线程负责将这些记录转换成请求,并发送至集群。使用之后关闭producer失败将会导致这些资源泄露。
我们看下KafkaProducer都有哪些成员变量,如下:
// 客户端ID:clientId
private String clientId;
// 分区器Partitioner实例partitioner
private final Partitioner partitioner;
// 最大请求大小maxRequestSize
private final int maxRequestSize;
// 内存总计大小totalMemorySize
private final long totalMemorySize;
// 集群元数据Metadata实例metadata
private final Metadata metadata;
// 记录收集器RecordAccumulator实例accumulator
private final RecordAccumulator accumulator;
// 后台发送线程Sender实例sender
private final Sender sender;
// 指标度量
private final Metrics metrics;
// io线程ioThread
private final Thread ioThread;
// 压缩类型CompressionType实例compressionType
private final CompressionType compressionType;
private final Sensor errors;
// 时间器
private final Time time;
// key序列化器keySerializer
private final Serializer<K> keySerializer;
// value序列化器valueSerializer
private final Serializer<V> valueSerializer;
// Producer配置信息ProducerConfig实例producerConfig
private final ProducerConfig producerConfig;
// 最大阻塞时间maxBlockTimeMs
private final long maxBlockTimeMs;
// 请求超时时间requestTimeoutMs
private final int requestTimeoutMs;
其中,比较重要的几个是:
1、分区器Partitioner实例partitioner:由它负责计算分区,确定主题内的实际存储位置;
2、集群元数据Metadata实例metadata:存储了整个集群的元数据信息,包括节点列表、主题列表、主题与分区列表映射等信息;
3、记录收集器RecordAccumulator实例accumulator:通过KafkaProducer发送的消息不会立即被发送到集群,而是先缓存在客户端内存缓冲池中,等待后台I/O线程处理;
4、后台发送线程Sender实例sender:一个后台工作的I/O线程,由它负责将客户端内存缓冲池中的数据发送到集群;
KafkaProducer的构造方法