【发布时间】:2018-11-04 23:33:45
【问题描述】:
假设自动提交间隔时间为 30 秒,消费者由于某种原因无法处理消息并持有超过 30 秒然后崩溃。自动提交偏移机制是否会在消费者崩溃之前提交此偏移?
如果我的假设是正确的,那么消息会因为提交的偏移量而丢失,但消息本身还没有被处理?
【问题讨论】:
标签: apache-kafka kafka-consumer-api
假设自动提交间隔时间为 30 秒,消费者由于某种原因无法处理消息并持有超过 30 秒然后崩溃。自动提交偏移机制是否会在消费者崩溃之前提交此偏移?
如果我的假设是正确的,那么消息会因为提交的偏移量而丢失,但消息本身还没有被处理?
【问题讨论】:
标签: apache-kafka kafka-consumer-api
假设您的消费者组名称是测试,并且您在消费者组中有一个消费者。
启用自动提交后,仅在 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() 没有被再次调用或消费者没有关闭,它不会提交偏移量。
【讨论】:
如果消费者收到消息 N,提交它然后在完全处理它之前崩溃,那么默认情况下消费者会认为这条消息已处理。
请注意,消息仍在代理上,因此可以重新消费以进行处理。但这需要您的应用程序中的一些逻辑,不仅要从上次提交的位置重新启动,还要检查以前的记录是否已成功处理。
如果您的应用程序通常需要很长时间来处理消息,那么您可能希望切换到手动提交而不是自动提交。这样您就可以更好地控制何时提交并避免此问题。
【讨论】: