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的构造方法