KafkaProducer简介
KafkaProducer是线程安全的,是一个不可变对象。负责将数据发送的kafka集群。生产者由一个缓冲空间池和一个后台I / O线程组成,该缓冲池保存尚未传输到服务器的记录,该I / O线程负责将这些记录转换为请求并将它们传输到集群。 使用后如果无法关闭生产者,则会泄漏这些资源。生产者发送数据时是异步的,将数据放入缓冲区使得数据可以进行批处理,以提高发送的效率。生产者为每个分区维护未发送记录的缓冲区。 这些缓冲区的大小由 batch.size 配置指定。 增大它可以进行更多的批处理,但是需要更多的内存。
KafkaProducer构造器
- 使用Map作为参数
public KafkaProducer(Map<String, Object> configs) {
this(new ProducerConfig(configs), null, null);
}
- 使用Properties作为参数(官方推荐)
public KafkaProducer(Properties properties) {
this(new ProducerConfig(properties), null, null);
}
传入的参数会新建一个ProducerConfig对象,ProducerConfig类为 Kafka Producer的配置类。还有其他构造器需指定key/value的序列化方式,在此不展开。
KafkaProducer发送数据的流程
KafkaProducer发送数据的send方法,支持回调,也可以直接发送数据。
@Override
public Future<RecordMetadata> send(ProducerRecord<K, V> record, Callback callback) {
// intercept the record, which can be potentially modified; this method does not throw exceptions
ProducerRecord<K, V> interceptedRecord = this.interceptors == null ? record : this.interceptors.onSend(record);
return doSend(interceptedRecord, callback);
}
send方法会调用doSend方法真正发送数据。在doSend方法执行前,如果用户指定了拦截器,record首先会先经过拦截器,对数据进行处理。
/**
* 实现异步发送数据到topic.
*/
private Future<RecordMetadata> doSend(ProducerRecord<K, V> record, Callback callback) {
TopicPartition tp = null;
try {
// 首先确保该topic的元数据信息可用
ClusterAndWaitTime clusterAndWaitTime = waitOnMetadata(record.topic(), record.partition(), maxBlockTimeMs);
long remainingWaitMs = Math.max(0