昨天在写一个java消费kafka数据的实例,明明设置auto.offset.reset为earliest,但仍是不从头开始消费,官网给出的含义太抽象了。
earliest: automatically reset the offset to the earliest offset,自动将偏移量置为最先的。难道不是topic中各分区的开始?结果还真不是,具体含义以下:java
earliest
当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,从头开始消费
latest
当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,消费新产生的该分区下的数据
none
topic各分区都存在已提交的offset时,从offset后开始消费;只要有一个分区不存在已提交的offset,则抛出异常测试
如下为测试详细:spa
Topic为lsztopic7,并生产30条信息。lsztopic7详情:
建立组为“testtopi7”的consumer,将enable.auto.commit设置为false,不提交offset。依次更改auto.offset.reset的值。此时查看offset状况为:
blog
earliest
客户端读取30条信息,且各分区的offset从0开始消费。
latest
客户端读取0条信息。
none
抛出NoOffsetForPartitionException异常。
图片
新建一个同组名的消费者时,auto.offset.reset值含义:
earliest 每一个分区是从头开始消费的。
none 没有为消费者组找到先前的offset值时,抛出异常kafka
测试场景一下latest时未接受到数据,保证该消费者在启动状态,使用生产者继续生产10条数据,总数据为40条。
it
latest
客户端取到了后生产的10条数据io
当建立一个新分组的消费者时,auto.offset.reset值为latest时,表示消费新的数据(从consumer建立开始,后生产的数据),以前产生的数据不消费。test
在测试环境二,总数为40条,无消费状况下,消费一批数据。运行消费者消费程序后,取到5条数据。
即,总数为40条,已消费5条,剩余35条。
基础
earliest
消费35条数据,即将剩余的所有数据消费完。
latest
消费9条数据,都是分区3的值。
offset:0 partition:3
offset:1 partition:3
offset:2 partition:3
offset:3 partition:3
offset:4 partition:3
offset:5 partition:3
offset:6 partition:3
offset:7 partition:3
offset:8 partition:3
none
抛出NoOffsetForPartitionException异常。
earliest 当分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,从头开始消费。
latest 当分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,消费新产生的该分区下的数据。
none 当该topic下全部分区中存在未提交的offset时,抛出异常。
再测试三的基础上,将数据消费完,再生产10条数据,确保每一个分区上都有已提交的offset。
此时,总数为50,已消费40,剩余10条
none
消费10条信息,且各分区都是从offset开始消费
offset:9 partition:3
offset:10 partition:3
offset:11 partition:3
offset:15 partition:0
offset:16 partition:0
offset:17 partition:0
offset:18 partition:0
offset:19 partition:0
offset:20 partition:0
offset:5 partition:2
值为none时,topic各分区都存在已提交的offset时,从offset后开始消费;只要有一个分区不存在已提交的offset,则抛出异常。
在测试四环境的基础上:总数为50,已消费40,剩余10条,建立不一样组的消费者,组名为testother7
earliest
消费50条数据,即将所有数据消费完。
latest
消费0条数据。
none
抛出异常
组与组间的消费者是没有关系的。 topic中已有分组消费数据,新建其余分组ID的消费者时,以前分组提交的offset对新建的分组消费不起做用。