Apache kafka 为什么消费者可以';在创建主题(以编程方式)并发布消息后,是否立即看到消息?

Apache kafka 为什么消费者可以';在创建主题(以编程方式)并发布消息后,是否立即看到消息?,apache-kafka,Apache Kafka,我注意到,如果我在创建主题之后立即创建主题并发布消息(都在同一个生产者程序中),则消费者程序不会分配分区(即,consumer.assignment()返回空分区列表)。但是,如果在使用者订阅主题之前添加一些等待,则分区分配工作正常,使用者接收消息 这是为什么?发送消息是异步的,这意味着send方法只向缓冲区添加记录,并立即返回。如果您在呼叫发送后立即开始阅读。要传输的记录可能仍在缓冲区空间中。这就是为什么您必须等待一段时间才能看到生成的消息。对于您的场景,KafkaProducer提供了一种刷

我注意到,如果我在创建主题之后立即创建主题并发布消息(都在同一个生产者程序中),则消费者程序不会分配分区(即,
consumer.assignment()
返回空分区列表)。但是,如果在使用者订阅主题之前添加一些等待,则分区分配工作正常,使用者接收消息


这是为什么?

发送消息是异步的,这意味着send方法只向缓冲区添加记录,并立即返回。如果您在呼叫发送后立即开始阅读。要传输的记录可能仍在缓冲区空间中。这就是为什么您必须等待一段时间才能看到生成的消息。对于您的场景,KafkaProducer提供了一种刷新方法,该方法可使所有缓冲记录立即可用以发送(即使linger.ms大于0),并在完成与这些记录关联的请求时阻止发送。见下面的代码:

for(ConsumerRecord<String, String> record: consumer.poll(100))
    producer.send(new ProducerRecord("my-topic", record.key(), record.value());
producer.flush();
consumer.commit();
for(消费者记录:consumer.poll(100))
producer.send(新的ProducerRecord(“我的主题”,record.key(),record.value());
producer.flush();
consumer.commit();

请检查此项,谢谢,但它仍然没有解释分区分配失败的原因。我可以理解,如果主题创建成功,即使消费者在主题创建后立即订阅了主题,也不会立即看到消息,但不应该将1个或多个分区分配给消费者?这意味着nt尚未出现,或者如果使用了主题订阅,则分区正在重新分配。因此,处理这种情况的唯一解决方案是引入等待,或者是否有其他方法确保kafka代理在调用
consumer.subscribe()之前准备好分区分配
?调用KafkaConsumer.assignment()检查分配是否尚未发生,或者分区是否正在重新分配。对于这些情况,请返回none。