【问题标题】:When does the consumer commit offset?消费者何时提交偏移量?
【发布时间】:2020-03-05 05:34:11
【问题描述】:

我正在使用 spring-kafka-2.2.7-RELEASE。我正在使用@KafkaListener 创建我的消费者。

我已将 enable.auto.commit 设置为 true 并将 auto.commit.interval.ms 设置为 10,000(即 10 秒)。现在我的问题是 - 消费者是每条记录的提交偏移量,还是它提交并通过它在 10 秒内消耗的记录数来推进偏移量?

【问题讨论】:

    标签: apache-kafka kafka-consumer-api spring-kafka


    【解决方案1】:

    我们一般不建议使用auto.commit.enabled=true;让容器使用BATCHRECORD AckModes 进行提交更具确定性(分别在下一个poll() 之前或处理每条记录之后)。

    在 2.3 版中,我们默认禁用自动提交(除非在配置中明确设置)。

    使用自动提交,我的理解是,如果自上次轮询后间隔已过,则提交将在 poll() 期间发生。它将提交自上次提交以来之前处理过的每个分区的最新偏移量。

    【讨论】:

    • 这是否意味着,如果我们在第一次轮询时获得 100 条记录,并且消费者在 10 秒的时间内只能处理 80 条记录,它是否提交并将偏移量提前 80 和剩余的 20消息丢失了?
    • 否;在处理完所有 100 条记录之前,我们不会再次调用 poll();如果处理所有 100 个需要 6 秒,则在处理完第二个 100 之前,不会提交前 100 个偏移量。如果需要 20 秒,偏移量将在下一次 poll() 时提交。正如我所说,我更喜欢使用侦听器容器的更具确定性的操作。使用AckMode.BATCH,偏移量将始终在完成后提交,无论需要多长时间。
    • 感谢您提供详细信息。如果我想在消费者提交偏移量时记录事件,我想知道 spring-kafka 是否有任何监听器
    • Kafka 本身提供了ConsumerInterceptor,它在提交偏移量时调用(自动或由容器)。实现接口并使用ConsumerConfig.INTERCEPTOR_CLASSES_CONFIG 告诉Kafka。
    • 谢谢。我会试试的。
    猜你喜欢
    • 1970-01-01
    • 2022-11-13
    • 2020-03-04
    • 1970-01-01
    • 2017-08-22
    • 2021-11-10
    • 2019-12-15
    • 2020-08-08
    • 2022-11-11
    相关资源
    最近更新 更多