【发布时间】:2019-11-30 02:44:36
【问题描述】:
我正在使用来自 kafka-client 1.0.0 库的 KafkaProducer,根据文档,Future<RecordMetadata> send(ProducerRecord<K, V> record) 方法将立即返回,但实际上,但看起来没有。这个方法还调用了同一个类中的另一个方法doSend(sn-p见下文),在这个方法内部,它正在等待主题的元数据,我认为这是必要的,因为它与分区等。
/**
* Implementation of asynchronously send a record to a topic.
*/
private Future<RecordMetadata> doSend(ProducerRecord<K, V> record, Callback callback) {
TopicPartition tp = null;
try {
// first make sure the metadata for the topic is available
ClusterAndWaitTime clusterAndWaitTime = waitOnMetadata(record.topic(), record.partition(), maxBlockTimeMs);
long remainingWaitMs = Math.max(0, maxBlockTimeMs - clusterAndWaitTime.waitedOnMetadataMs);
Cluster cluster = clusterAndWaitTime.cluster;
还有其他完全异步的选项吗?我希望它完全异步的问题是因为如果bootstrap.servers 中的某些服务器没有响应,它将等待基于max.block.ms 的时间,但我实际上并不希望它等待,但相反,我只是希望它返回。
我看到它会立即返回的文档: KafkaProducer java doc
发送是异步的,该方法会立即返回一次 记录已存储在等待记录的缓冲区中 发送。这允许并行发送许多记录而不会阻塞 等待每个之后的响应。
【问题讨论】:
标签: apache-kafka kafka-producer-api