
Kafka
消费者——从
Kafka
读取数据
|
59
在使用自动提交时,每次调用轮询方法都会把上一次调用返回的偏移量提交上去,它并不
知道具体哪些消息已经被处理了,所以在再次调用之前最好确保所有当前调用返回的消息
都已经处理完毕(在调用
close() 方法之前也会进行自动提交)。一般情况下不会有什么问
题,不过在处理异常或提前退出轮询时要格外小心。
自动提交虽然方便,不过并没有为开发者留有余地来避免重复处理消息。
4.6.2
提交当前偏移量
大部分开发者通过控制偏移量提交时间来消除丢失消息的可能性,并在发生再均衡时减少
重复消息的数量。消费者
API
提供了另一种提交偏移量的方式,开发者可以在必要的时候
提交当前偏移量,而不是基于时间间隔。
把 enable.auto.commit 设为 false,让应用程序决定何时提交偏移量。使用 commitSync()
提交偏移量最简单也最可靠。这个
API
会提交由 poll() 方法返回的最新偏移量,提交成
功后马上返回,如果提交失败就抛出异常。
要记住,commitSync() 将会提交由 poll() 返回的最新偏移量,所以在处理完所有记录后要
确保调用了 commitSync(),否则还是会有丢失消息的风险。如果发生了再均衡,从最近一
批消息到发生再均衡之间的所有消息都将被重复处理。
下面是我们在处理完最近一批消息后使用 commitSync() 方法提交偏移量的例子。
while (true) {
ConsumerRecords<String, String> records ...