我正在使用某个主题的Kafka消息,但是问题是,每次使用者重新启动时,它都会读取较旧的已处理消息。
我用过auto.offset.reset=earliest
。使用commit async手动设置它可以帮助我解决此问题吗?
我看到默认情况下,Kafka已经启用了对true
的自动提交。
答案 0 :(得分:1)
我用过
auto.offset.reset=earliest
。会手动设置 使用commit async可以帮助我克服这个问题吗?
设置了auto.offset.reset=earliest
后,消费者将从可用的最早偏移量中读取,而不是从最后一个偏移量中读取。因此,第一次,您将使用新的group.id
启动流程并将其设置为earliest
,它将从起始偏移量开始读取。
这是我们可以调试问题的方式。
如果您的使用者group.id
在每次重新启动时都相同,则需要检查提交是否确实在进行。
enable.auto.commit
覆盖为false
。auto.commit.interval.ms
的自动提交间隔(5 sec
),看看是否已将其更改为更高的值,并且在触发提交之前要重新启动进程。 commitAsync()
甚至commitSync()
手动触发。使用commitSync()
(阻塞调用)测试提交时是否有任何异常。提交期间很少可能的错误是(来自docs)
CommitFailedException
-尝试提交分区时 不再分配给此消费者的原因是,消费者 例如不再是该组的一部分
RebalanceInProgressException
-如果使用者实例位于 重新平衡的中间,因此尚未确定哪个分区 将分配给消费者。
TimeoutException
-如果超时指定为default.api.timeout.ms
在成功完成 补偿提交
除此之外。
seek()
或seekToBeginning()
。如果您这样做并致电poll()
,则可能还会收到较旧的消息。如果不查看代码,很难确定错误的确切原因。该答案仅提供有关调试方案的见识。