Java KafkaProducer使用send()是线程安全吗?是否可以让同一个KafkaProducer实例在多个线程中共享?

Apache Kafka的KafkaProducer被设计为线程安全,可以在多个线程中共享,避免了额外的资源开销。由于其内部管理TCP连接,并在初始化时建立到Kafka集群的连接,这些连接在实例生命周期内保持,不会因线程并发使用而关闭。这种设计提高了性能,但也可能导致缓存溢出。共享实例意味着所有线程共享消息缓冲区,因此需要注意监控和调整buffer.memory参数以确保有效利用资源。
摘要由CSDN通过智能技术生成

同一个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);
    }






如有错误欢迎指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只小小狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值