假设自动提交间隔时间是30秒,消费者由于某些原因无法处理消息并保持超过30秒然后崩溃。在消费者崩溃之前,自动提交偏移机制是否会提交此偏移?
如果我的假设是正确的,那么邮件会在提交偏移量时丢失,但邮件本身尚未处理?
答案 0 :(得分: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()或者没有关闭消费者,它将不会提交偏移量。
答案 1 :(得分:0)
如果消费者收到消息N,提交消息然后在完全处理之前崩溃,那么默认情况下,消费者会认为此消息已处理。
请注意,该消息仍在代理上,因此可以重新使用它以进行处理。但是,这需要您的应用程序中的一些逻辑,不仅要从上次提交的位置重新启动,还要检查以前的记录是否已成功处理。
如果您的应用程序通常需要很长时间来处理消息,那么您可能希望切换到手动提交而不是自动提交。通过这种方式,您可以更好地控制何时提交并避免此问题。