我希望有一个固定价格的Kafka消费者,这样我们每三分钟可以轮询一次主题并处理收到的记录(假设这些记录将在3分钟内处理)。
我写了下面的代码
consumer.subscribe("myTopic", this); //this class implements ConsumerRebalanceListener
Executors.newScheduledThreadPool(1).scheduleAtFixedRate(() -> {
LOGGER.debug("FIRE");
try {
ConsumerRecords<String, String> consumerRecords = consumer
.poll(Duration.ofMillis(100)); //return quickly.
//myMessageHandler.handle(consumerRecords);
consumer.commitSync();//have set enable.auto.commit to false
} catch(Exception exception) {
consumer.close();
}
}, 5, 180, TimeUnit.SECONDS);//initial delay 5 sec, and then every 3 minutes
似乎消费者在等待了几分钟(大约9-10分钟)后,正在获取onPartitionsRevoked()或onPartitionsAssigned()的回调。因此poll()在这段时间内不会返回任何记录。
但是,如果我将Consumer.poll()的超时时间从100ms增加到1000ms。重新平衡(分区分配)发生在第一次调用poll()期间,并开始返回记录。
分区分配是否与poll()超时有关?如果poll()超时时间较长,则分区分配会在对poll()的第一次调用时发生,而对于poll(timeout <= 100ms),则需要花费几分钟(或多次调用poll())才能完成分区分配。