我有一个批处理作业,每天会触发一次。要求是
目前我在while循环中poll()消息,直到ConsumerRecords.isEmpty()为true。当ConsumerRecords.isEmpty()为true时,我假设已经消耗了Topic上可用的所有记录。该应用程序维护抵消并关闭卡夫卡消费者。
当消息处理完成并成功完成后,我创建了一个新的KafkaConsumer并提交了应用程序维护的偏移量。
注意我关闭最初用于读取消息的KafkaConsumer,并使用另一个KafkaConsumer实例提交偏移量以避免消费者重新平衡异常。
我期待主题上最多5k条消息。该主题已分区并复制。
有没有更好的方法在特定时间点消费主题上的所有消息?我有什么遗失或需要照顾的吗?我不认为我需要处理消费者重新平衡,因为我在循环中对poll()进行轮询并在轮询完成后处理消息。
我正在使用java kafka客户端v0.9,如果在上述场景中有帮助,可以更改为v0.10。
由于
更新:
AtomicBoolean flag = new AtomicBoolean();
flag.set(true);
while(flag.get()) {
ConsumerRecords<String, String> consumerRecords = kafkaConsumer.poll(timeout);
if(consumerRecords.isEmpty()) {
flag.set(false);
continue;
}
//if the ConsumerRecords is not empty process the messages and continue to poll()
}
kafkaConsumer.close();
答案 0 :(得分:0)
您不能假设在调用poll()之后,由于使用者的max.poll.records配置参数,您已阅读该时刻主题中可用的所有消息。这是单个poll()返回的最大记录数,其默认值为500.这意味着如果在该时刻主题中有600条消息,则需要在poll()上进行两次调用以读取所有消息(但考虑到其他一些消息可能会到达)。 我不明白的另一件事是为什么你使用不同的消费者来提供补偿。您正在谈论的消费者再平衡异常是什么?