首先先给大家看一下kafka的三个重要的属性
下面是这三个属性的组合以及分别表示的意义
一、(enable.auto.commit:false) + (auto.offset.reset:latest):
在Broker到Consumer之间实现了至多一次语义,因为不使用Kafka提供的自动保存offset功能,每次应用程序启动时,都是从Topic的末尾位置来获取消息。也就是说,应用程序因为故障失败,或者是人为的停止后,如果Producer向Broker发送新的消息,当再次启动应用程序时,Consumer从指定的Topic的末尾来开始消费,这就导致了这部分新产生的消息丢失。
二、
(enable.auto.commit:false) + (auto.offset.reset:latest):
在Broker到Consumer之间实现了至多一次语义,因为不使用Kafka提供的自动保存offset功能,每次应用程序启动时,都是从Topic的末尾位置来获取消息。也就是说,应用程序因为故障失败,或者是人为的停止后,如果Producer向Broker发送新的消息,当再次启动应用程序时,Consumer从指定的Topic的末尾来开始消费,这就导致了这部分新产生的消息丢失。
三、
(enable.auto.commit:true)+(auto.offset.reset:earliest)+(auto.commit.interval.ms) :
在Broker到Consumer之间实现了精确一次语义,因为使用了Kafka提供的自动保存offset功能,当应用程序第一次启动时,首先从Topic的初试位置来获取消息,原有的消息一个都没有丢失;紧接着,在auto.commit.interval.ms时间后,Kafka会使用coordinator协议commit当前的offset(topic的每个分区的offset)。当应用程序因为故障失败,或者是人为的停止,再次启动应用程序时,都会从coordinator模块获取Topic的offset,从上一次消费结束的位置继续消费,所以不会重复消费已经消费过的消息,也不会丢失在应用程序停止期间新产生的消息,做到了Broker到Consumer之间精确一次的传递。