我正在使用 Azkaban 工作从 Kafka 主题中消费。我不想实现长时间运行的 while(true)
循环,因为主题是低吞吐量。我还想确保至少一次交付语义。
主题有 5 个分区。我的单线程 Azkaban 作业消费者有什么方法可以轮询所有分区、获取数据、处理它们并在提交后终止? 到目前为止,我想出了这个:
//set "enable.auto.commit": "false" in the properties
Consumer<String, String> kafkaConsumer = new KafkaConsumer<>(properties);
kafkaConsumer.subscribe(Arrays.asList(kafkaConfig.getTopicName()));
long t = System.currentTimeMillis();
long end = t+15000;
try{
while (System.currentTimeMillis() < end) {
ConsumerRecords<String, String> records = kafkaConsumer.poll(Duration.ofMillis(1000));
for (ConsumerRecord<String, String> record : records) {
log.info("offset = {}, key = {}, partition = {}", record.offset(), record.key(), record.partition());
// do my processing involving some DB calls
}
kafkaConsumer.commitSync();
}
} catch (Exception e){
log.error(e.toString());
} finally {
kafkaConsumer.close();
}
寻找更优雅的解决方案的建议。有关了解单个 Kafka 消费者如何在轮询中使用多个分区的任何资源。它是否只从轮询中的一个分区读取以及何时移动到第二个分区?