Kafka生产者源码解析之一KafkaProducer

这篇博客是Kafka生产者源码解析系列的第一部分,主要聚焦在KafkaProducer的doSend方法和waitOnMetadata方法。文章介绍了send方法如何通过拦截器处理数据,并详细讲解了doSend方法中metadata的获取和RecordAccumulator的使用。作者还提出了对waitOnMetadata中重复添加topic和两次调用sender.wakeup()的疑惑,期待读者和专家的解答。
摘要由CSDN通过智能技术生成

目录

Kafka生产者源码解析之一KafkaProducer
Kafka生产者源码解析之二RecordAccumulator
Kafka生产者源码解析之三NIO
Kafka生产者源码解析之四Sender
Kafka生产者源码解析之五小结

处女作

之前一直作为C端用户,受益良多,因此转型为B端,分享心得,努力做到不误人子弟。当然同时也想得到大神们的指正和解惑。因为最近在学习kafka,故以它开始。

程序开始

kafka版本: 2.1.1
kafka生产者都是以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.onSend(record);
        return doSend(interceptedRecord, callback);
    }

方法首先会进入拦截器集合ProducerInterceptors
onSend方法是遍历拦截器的onSend方法。
拦截器的目的是将数据处理加工,kafka本身并没有给出默认的拦截器的实现。
因此,如果需要使用拦截器功能,必须自己实现 ProducerInterceptor 接口。

doSend方法

此方法为kafka生产者的核心方法。

/**
     * Implementation of asynchronously send a record to a topic.
     */
    private Future<RecordMetadata> doSend(ProducerRecord<K, V> record, Callback callback) {
   
        // 首先创建一个主题分区类
        TopicPartition tp = null;
        try {
   
            throwIfProducerClosed();
            // first make sure the metadata for the topic is available
            ClusterAndWaitTime clusterAndWaitTime;
            try {
   
                clusterAndWaitTime = waitOnMetadata(record.topic(), record.partition(), maxBlockTimeMs);
            } catch (KafkaException e) {
   
                if (metadata.isClosed())
                    throw new KafkaException("Producer closed while send in progress", e);
                throw e;
            }
            long remainingWaitMs = Math.max(0, maxBlockTimeMs - clusterAndWaitTime.waitedOnMetadataMs);
            Cluster cluster = clusterAndWaitTime.cluster;
            byte[] serializedKey;
            try {
   
                // 序列化key
                serializedKey = keySerializer.serialize(record.topic(), record.headers(), record.key());
            } catch (ClassCastException cce) {
   
                throw new SerializationException("Can't convert key of class " + record.key().getClass()</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值