多分区主题只有 1 个消费者的 Kafka 消费者批量消费

时间:2021-03-06 08:51:59

标签: apache-kafka kafka-consumer-api

我正在使用 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 消费者如何在轮询中使用多个分区的任何资源。它是否只从轮询中的一个分区读取以及何时移动到第二个分区?

0 个答案:

没有答案