offset回滚后无法重复消费数据

来源:7-3 Consumer之手动提交

abulaka

2020-04-16

老师好,想问一下关于offset的手动提交。
如果通过offset的手动提交的话,执行了consumer.commitAsync()以后offset会被提交,下次就不会对这些数据进行处理了。
想问的是,如果我把consumer.commitAsync()注释掉了,为什么在while里通过consumer.poll也不会获取到这些数据,只能停止当前进程后再启动才可以获取到这些rollback的数据。
我理解的是因为没有执行consumer.commitAsync()而rollback了,那么在下一次while循环里应该可以通过consumer.poll再获取到这些数据。

public static void commitedOffset() {
    Properties properties = buildProperties();
    KafkaConsumer<String, String> consumer = new KafkaConsumer<>(properties);
    consumer.subscribe(Arrays.asList(TOPIC_NAME));
    while (true) {
        ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(10000));
        for (ConsumerRecord<String, String> record : records) {
            System.out.printf("patition=%d, offset=%d, key=%s, value=%s%n", record.partition(), record.offset(), record.key(), record.value());
        }
//        consumer.commitAsync();
    }
}
写回答

1回答

Allen

2020-04-16

因为会有缓存呀, consumer比大家想象的还要智能一点的 哈哈

1
9
Allen
回复
水桶一号
既然没提交, 被重新消费到不是正常的么
2021-12-18
共9条回复

Kafka多维度系统精讲,从入门到实战开发

系统讲解Kafka,实战结合,让你成为使用Kafka的高手

896 学习 · 237 问题

查看课程