KafkaProducer生产者发送数据源码分析

本文详细介绍了KafkaProducer的工作原理,包括构造器、发送数据流程和重要配置参数如acks、batch.size、linger.ms及enable.idempotence。分析了acks设置对消息确认的影响,讨论了幂等性和数据持久性的保证,强调了正确配置以防止数据丢失的重要性。
摘要由CSDN通过智能技术生成
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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值