【问题标题】:Kafka Partition is null卡夫卡分区为空
【发布时间】:2021-03-01 13:26:33
【问题描述】:

我正在使用spring kafka模板将消息写入kafka主题,并且使用以下API来发布消息。

public ListenableFuture<SendResult<K, V>> send(String topic, K key, @Nullable V data) {... }

使用这个 API 的好处是它返回一个 sendResult 对象,其中包含一些元数据,如主题、分区、标题等。我有一个回调,它在 onSuccess 时打印 sendResult。现在的问题是,分区被打印为空。

我没有回拨,而是尝试将其更改为 future.get(10, TimeUnit.SECONDS) 获取发送结果。即使这样,分区也打印为空。谁能让我知道这可能是什么原因?这是 kafka 的默认行为吗?

【问题讨论】:

    标签: apache-kafka spring-kafka kafka-producer-api


    【解决方案1】:

    您可能需要在 SendResult.getRecordMetadata() 而不是 getProducerRecord() 中查看该信息。

    ProducerRecord 未被KafkaProducer 修改。所以,你使用的 API 最终是这样的:

    public ListenableFuture<SendResult<K, V>> send(String topic, K key, @Nullable V data) {
        ProducerRecord<K, V> producerRecord = new ProducerRecord<>(topic, key, data);
        return doSend(producerRecord);
    }
    

    ProducerRecordpartition 属性确实是 null

    另一方面,RecordMetadata 确实是在服务器应答之后构建的。 您可以从其partition() 选项中获取所需信息。

    【讨论】:

    • SendResult [producerRecord=ProducerRecord(topic=topic-1, partition=null, headers=RecordHeaders(headers = [], isReadOnly = true), key=null, value=foo, timestamp=null), recordMetadata=topic-1-0@0].
    • @Artem Bilen RecordMetaData 中的分区方法确实在打印主题。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多