Kafka有关Poll 方法的疑问

Iyxh 发表于: 2019-08-07   最后更新时间: 2019-08-07  

前提:

1.将kafka自动提交offsets取消掉,并且不提交offsets

场景:

假设kafka(一个topic,只有一个分区,所有消费者都在一个消费者组中)中有10条消息未消费,在第一次启动消费者拉取数据的时候,会将这10条消费完,由于没有自动提交offsets,且也没有进行手动提交offsets,此时重启消费者程序拉取数据的时候,会重复消费(这是必然的)。

疑问:

上面出现的场景,由于取消自动提交offsets,且手动也没有提交offsets,所以重启消费者消费会重复消费是正常情况。但是我的疑问是,在第一次启动消费者程序(不断进行poll轮询)的时候,为什么没有手动提交offsets,此时poll不会重复拉取相同的数据,而是需要重启消费者程序的poll才会重复拉取数据呢?



您需要解锁本帖隐藏内容请: 点击这里
本帖隐藏的内容





发表于: 16天前   最后更新时间: 16天前   游览量:91
上一条: java 操作kafka acl?
下一条: kafka集群某topic无消息报错handling request

  • 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,这样做的好处是什么呢,减少请求吗?