Kafka 位移提交

如题所述

第1个回答  2022-07-11

在Kafka中,Consumer端会记录要消费的下一条消息的位移。
Consumer需要向Kafka汇报自己的位移数据,这个汇报过程被称为提交位移(Committing Offsets)。因为Consumer能够同时消费多个分区的数据,所以位移的提交实际上是在分区粒度上进行的,即Consumer需要为分配给它的每个分区提交各自的位移数据。

KafkaConsumer API提供了多种提交位移的方法
从用户角度来说,位移提交分为自动提交和手动提交;从Consumer端的角度来说,位移提交分为同步提交和异步提交。

自动提交能保证不会出现数据丢失的情况吗?
如果设置为自动提交,Kafka会保证开始调用poll方法时,提交上次poll返回的所有消息。poll方法的逻辑是先提交上一批消息的位移,再处理下一批消息,因此能保证不出现消费丢失的情况。但是可能会出现 重复消费

同步提交和异步提交
Kafka提供了KafkaConsumer#commitSync()方法,这是一个同步操作,会一直等待,直到位移被提交成功。
另一个KafkaConsumer#commitAsync()方法,是一个异步操作。

注意:异步提交并不能替代同步提交,因为在出现问题时它不会自动重试。
我们需要组合使用两种提交方式:

这样,即实现了异步无阻塞式的位移管理,也确保了Consumer位移的正确性。

相似回答