同一个KafkaProducer实例在多个线程中共享
这是完全允许的场景,因为KafkaProducer是线程安全的。这种情况下,多个线程共享此producer实例以及同一套消息缓冲区资源,即它们共同使用由buffer.memory参数指定的缓存,因此有可能比第一种情况更容易出现缓存溢出的情形。这么做的好处在于只需要创建一套资源即可。
为什么是线程安全?
Java KafkaProducer生产者是如何管理TCP连接的? 何时建立?何时关闭?
首先Apache Kafka 的所有通信都是使用TCP,在最初的创建连接的时候会,建立起TCP连接并且连接到整个Kafka集群,如下代码时,就会创建一个连接并且不会自动关闭。
public void newInstance() {
Producer<String, String> producer = new KafkaProducer<>(props);
}
在此连接下调用KafkaProducer实例方法,即使共享我们并不改变这个KafkaProducer实例,只是通过这个KafkaProducer实例,发送消息,所以是线程安全的。
@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.onSend(record);
return doSend(interceptedRecord, callback);
}
如有错误欢迎指正