Kafka 分区为空

Kafka Partition is null

我正在使用 spring kafka 模板向 kafka 主题写入消息,下面 API 用于发布消息。

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

使用这个 API 的好处是它 returns 一个 sendResult object 它有一些元数据,如主题、分区、headers 等。我有一个onSuccess 时打印 sendResult 的回调。现在的问题是,分区被打印为空。

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

您可能需要在 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() 选项中获取所需信息。