如果消费者持有的消息长于自动提交间隔时间,kafka是否会丢失消息?

时间:2018-05-25 14:22:43

标签: apache-kafka kafka-consumer-api

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

如果我的假设是正确的,那么邮件会在提交偏移量时丢失,但邮件本身尚未处理?

2 个答案:

答案 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,提交消息然后在完全处理之前崩溃,那么默认情况下,消费者会认为此消息已处理。

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

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