KafkaProducer线程安全吗?

简介: KafkaProducer线程安全吗?

这是我今天面试被问的一个问题,这会回来就来看看源码

先看KafkaProducer的构造函数

public KafkaProducer(Map<String, Object> configs) {

   this((ProducerConfig)(new ProducerConfig(configs)), (Serializer)null, (Serializer)null);
}


public KafkaProducer(Map<String, Object> configs, Serializer<K> keySerializer, Serializer<V> valueSerializer) {

   this(new ProducerConfig(ProducerConfig.addSerializerToConfig(configs, keySerializer, valueSerializer)), keySerializer, valueSerializer);
}


public KafkaProducer(Properties properties) {

   this((ProducerConfig)(new ProducerConfig(properties)), (Serializer)null, (Serializer)null);
}


public KafkaProducer(Properties properties, Serializer<K> keySerializer, Serializer<V> valueSerializer) {

   this(new ProducerConfig(ProducerConfig.addSerializerToConfig(properties, keySerializer, valueSerializer)), keySerializer, valueSerializer);
}


private KafkaProducer(ProducerConfig config, Serializer<K> keySerializer, Serializer<V> valueSerializer) {

如果我们使用KafkaProducer

我们就看send方法是不是安全

RecordAppendResult result = this.accumulator.append(tp, timestamp, serializedKey, serializedValue, headers, (Callback)interceptCallback, remainingWaitMs);

再看下accumulator 的主要属性

从ConcurrentMap<TopicPartition, Deque<ProducerBatch>> batches;

获取Deque,通过synchronized 进行发送,好了我们知道KafkaProducer是线程安全的,但是KafkaTemplate是线程安全的吗?

双重检测 +volatile

private volatile DefaultKafkaProducerFactory.CloseSafeProducer<K, V> producer;


单例模式,也是线程安全的,官网的话

A template for executing high-level operations. When used with a DefaultKafkaProducerFactory, the template is thread-safe. The producer factory and KafkaProducer ensure this; refer to their respective javadocs.

KafkaTemplate 需要和DefaultKafkaProducerFactory一起使用

相关文章
|
缓存 NoSQL Java
面试官:如何保证本地缓存的一致性?
面试官:如何保证本地缓存的一致性?
2339 1
|
Kubernetes 网络性能优化 调度
聊聊 K8S pod 的 QoS(Quality Of Service)
聊聊 K8S pod 的 QoS(Quality Of Service)
|
消息中间件 缓存 资源调度
在 Flink 算子中使用多线程如何保证不丢数据?
本人通过分析痛点、同步批量请求优化为异步请求、多线程 Client 模式、Flink 算子内多线程实现以及总结四部分帮助大家理解 Flink 中使用多线程的优化及在 Flink 算子中使用多线程如何保证不丢数据。
在 Flink 算子中使用多线程如何保证不丢数据?
|
监控 架构师 Java
JVM 8 调优指南:如何进行JVM调优,JVM调优参数
这篇文章将详细介绍如何进行JVM 8调优,包括JVM 8调优参数及其应用。此外,我将提供12个实用的代码示例,每个示例都会结合JVM启动参数和Java代码。JVM调优是指通过调整Java虚拟机的配置来提升Java应用程序的性能。这包括优化堆内存设置、选择合适的垃圾收集器以及调整其他性能相关的参数。
1104 0
|
前端开发 安全 Ubuntu
Elasticsearch安装和配置
Elasticsearch安装和配置
271 0
|
11月前
|
开发框架 数据可视化 JavaScript
鸿蒙可视化代码生成器神器
本文介绍了鸿蒙生态中的ArkTS语言,它在TypeScript基础上强化了静态类型并提供声明式UI和状态管理。同时,ArkUI作为分布式UI开发框架,提升了界面开发效率,且配合可视化工具的改进,简化了组件管理和API集成过程。
261 0
|
消息中间件 Kafka
基于commons-pool2实现KafkaProducer池来提升kafka发送消息性能
基于commons-pool2实现KafkaProducer池来提升kafka发送消息性能
1776 0
|
消息中间件 NoSQL Java
Java必备面试题(100题)-八股篇
主要包括一些高频的Java面试的八股文面试题和答案
|
前端开发
浏览器接收Long型数据精度丢失问题的解决方案
浏览器接收Long型数据精度丢失问题的解决方案
|
Kubernetes 监控 Linux
不借助 Docker Desktop 在Mac上开发容器应用
![](https://ata2-img.oss-cn-zhangjiakou.aliyuncs.com/neweditor/e2096947-f310-4ac5-a413-ec2b28b0e040.png) Docker Desktop是最为流行的开发者工具,Docker公司在 8/31 宣布对Docker Desktop的用户协议进行了变更,对个人开发者继续免费,但是对商业开发者采取了收费策
1895 114
不借助 Docker Desktop 在Mac上开发容器应用