【问题标题】:Does kafka lose message if consumer holds message longer then auto commit interval time?如果消费者持有消息的时间比自动提交间隔时间长,kafka 会丢失消息吗?
【发布时间】:2018-11-04 23:33:45
【问题描述】:

假设自动提交间隔时间为 30 秒,消费者由于某种原因无法处理消息并持有超过 30 秒然后崩溃。自动提交偏移机制是否会在消费者崩溃之前提交此偏移?

如果我的假设是正确的,那么消息会因为提交的偏移量而丢失,但消息本身还没有被处理?

【问题讨论】:

    标签: apache-kafka kafka-consumer-api


    【解决方案1】:

    假设您的消费者组名称是测试,并且您在消费者组中有一个消费者。

    启用自动提交后,仅在 poll() 调用和消费者关闭期间提交偏移量。

    例如,auto.commit.interval.ms 是 5 秒,每次调用 poll() 需要 7 秒。每次调用 poll() 时,它会检查自动提交间隔是否已过,如果已过,如上例所示,它将提交偏移量。

    在消费者关闭期间也会提交偏移量。

    来自文档 -

    “关闭消费者,等待最多 30 秒的默认超时以进行任何需要的清理。如果启用自动提交,这将在默认超时内尽可能提交当前偏移量”。

    您可以在这里阅读更多相关信息 -

    https://kafka.apache.org/10/javadoc/index.html?org/apache/kafka/clients/consumer/KafkaConsumer.html

    现在,关于你的问题,如果 poll() 没有被再次调用或消费者没有关闭,它不会提交偏移量。

    【讨论】:

      【解决方案2】:

      如果消费者收到消息 N,提交它然后在完全处理它之前崩溃,那么默认情况下消费者会认为这条消息已处理。

      请注意,消息仍在代理上,因此可以重新消费以进行处理。但这需要您的应用程序中的一些逻辑,不仅要从上次提交的位置重新启动,还要检查以前的记录是否已成功处理。

      如果您的应用程序通常需要很长时间来处理消息,那么您可能希望切换到手动提交而不是自动提交。这样您就可以更好地控制何时提交并避免此问题。

      【讨论】:

      • 就我而言,我使用 KStream。据我了解,它只支持内部自动提交。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-12
      • 1970-01-01
      • 1970-01-01
      • 2017-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多