前提:
将kafka自动提交offsets取消掉,并且不提交offsets。
场景:
假设kafka(一个topic,只有一个分区,所有消费者都在一个消费者组中)中有10条消息未消费,在第一次启动消费者拉取数据的时候,会将这10条消费完,由于没有自动提交offsets,且也没有进行手动提交offsets,此时重启消费者程序拉取数据的时候,会重复消费(这是必然的)。
疑问:
上面出现的场景,由于取消自动提交offsets,且手动也没有提交offsets,所以重启消费者消费会重复消费是正常情况。但是我的疑问是,在第一次启动消费者程序(不断进行poll轮询)的时候,为什么没有手动提交offsets,此时poll不会重复拉取相同的数据,而是需要重启消费者程序的poll才会重复拉取数据呢?
1、既然你已经取消了自动提交,则任何时候都不会提交。
2、poll kafka的消息时候,每次都会带上你需要的offset的位置,kafka按这个给你消息的。你客户端程序本身也会“缓存”这个offset位置,自然不会拉取到重复的。当你重启后,客户端程序会向kakfa获取最后一次的offset位置。就poll到了重复的数据了。
关于第二点,我有个疑问。poll的时候,会带上我需要的offset,这个offsets是从哪里获取的。
因为我以前一直觉得这个offsets是从kafka的consumer_offsets中获取的。但是通过这个案例我觉得可能并非是从consumer_offsets中获取的,倘若每次poll都是从consumer_topic,由于没有提交offsets,按道理应该是每次都会获取到重复数据,而非需要重新启动消费者程序。
而客户端本身会缓存这个offsets位置,我可以理解为只有第一次poll的时候才从consumer_offsets中获取offsets,后续的操作从客户端本身维护的offsets来进行获取消息的吗?采用本身缓存offsets而非从consumer_offsets,这样做的好处是什么呢,减少请求吗?
第一次是从consumer_topic获取,之后就是客户端自己维护offset位置了,而不是服务器控制的。
不管是自动提交还是手动提交,实际上都是只有第一次才是从consumer_offset获取吗
嗯,是的
好的,感谢
你的答案