public class KafkaProducer<K, V> implements Producer<K, V> {
private final Logger log;
/** clientId 生成器,如果没有明确指定客户端 ID,则使用该字段顺序生成一个 */
private static final AtomicInteger PRODUCER_CLIENT_ID_SEQUENCE = new AtomicInteger(1);
private static final String JMX_PREFIX = "kafka.producer";
public static final String NETWORK_THREAD_PREFIX = "kafka-producer-network-thread";
public static final String PRODUCER_METRIC_GROUP_NAME = "producer-metrics";
/** 生产者唯一标识(对应 client.id 属性配置 ) */
private final String clientId;
// Visible for testing
final Metrics metrics;
/** 分区选择器(对应 partitioner.class 属性配置),如果未明确指定分区,则基于一定的策略为消息选择合适的分区 */
private final Partitioner partitioner;
/** 消息的最大长度(对应 max.request.size 配置,包含消息头、序列化之后的 key 和 value) */
private final int maxRequestSize;
/** 发送单条消息的缓冲区大小(对应 buffer.memory 配置) */
private final long totalMemorySize;
/** kafka 集群元数据 */
private final ProducerMetadata metadata;
/** 消息收集器,用于收集并缓存消息,等待 Sender 线程的发送 */
private final RecordAccumulator accumulator;
/** 消息发送线程对象 */
private final Sender sender;
/** 消息发送线程 */
private final Thread ioThread;
/** 压缩算法(对应 compression.type 配置) */
private final CompressionType compressionType;
private final Sensor errors;
/** 时间戳工具 */
private final Time time;
/** key 序列化器(对应 key.serializer 配置) */
private final Serializer<K> keySerializer;
/** value 序列化器(对应 value.serializer 配置) */
private final Serializer<V> valueSerializer;
/** 封装配置信息 */
private final ProducerConfig producerConfig;
/** 等待更新 kafka 集群元数据的最大时长 */
private final long maxBlockTimeMs;
/** 发送拦截器(对应 interceptor.classes 配置),用于待发送的消息进行拦截并修改,也可以对 ACK 响应进行拦截处理 */
private final ProducerInterceptors<K, V> interceptors;
private final ApiVersions apiVersions;
private final TransactionManager transactionManager;
}
生产者初始化如下:
KafkaProducer(Map<String, Object> configs,
Serializer<K> keySerializer,
Serializer<V> valueSerializer,
ProducerMetadata metadata,
KafkaClient kafkaClient,
ProducerInterceptors interceptors,
Time time) {
ProducerConfig config = new ProducerConfig(ProducerConfig.addSerializerToConfig(configs, keySerializer,
valueSerializer));
try {
// 获取用户配置信息
Map<String, Object> userProvidedConfigs = config.originals();
this.producerConfig = config;
this.time = time;
String transactionalId = userProvidedConfigs.containsKey(ProducerConfig.TRANSACTIONAL_ID_CONFIG) ?
(String) userProvidedConfigs.get(ProducerConfig.TRANSACTIONAL_ID_CONFIG) : null;
// 尝试获取用户配置的 clientId,如果未配置则基于 PRODUCER_CLIENT_ID_SEQUENCE 顺序生成一个
this.clientId = buildClientId(config.getString(ProducerConfig.CLIENT_ID_CONFIG), transacti