昨天在写一个 java 消费kafka数据的实例,明明设置auto.offset.reset为 earliest,但还是不从头开始消费,官网给出的含义太抽象了。
earliest: automatically reset the offset to the earliest offset,自动将偏移量置为最早的。难道不是 topic 中各分区的开始?结果还真不是,具体含义如下:
auto.offset.reset值含义解释
earliest
当各分区下有已提交的 offset 时,从提交的 offset 开始消费;无提交的 offset 时,从头开始消费
latest
当各分区下有已提交的 offset 时,从提交的 offset 开始消费;无提交的 offset 时,消费新产生的该分区下的数据
none
topic 各分区都存在已提交的 offset 时,从 offset 后开始消费;只要有一个分区不存在已提交的 offset,则抛出异常
以下为测试详细:
1.同分组下测试
1.1 测试一
1.1.1 测试环境
Topic 为 lsztopic7,并生产 30 条信息。lsztopic7 详情:
创建组为“testtopi7”的 consumer,将 enable.auto.commit 设置为 false,不提交 offset。依次更改auto.offset.reset的值。此时查看 offset 情况为:
1.1.2 测试结果
earliest
客户端读取 30 条信息,且各分区的 offset 从 0 开始消费。
latest
客户端读取 0 条信息。
none
抛出 NoOffsetForPartitionException 异常。
1.1.3 测试结论
新建一个同组名的消费者时,auto.offset.reset值含义:
earliest 每个分区是从头开始消费的。
none 没有为消费者组找到先前的 offset 值时,抛出异常
1.2 测试二
1.2.1 测试环境
测试场景一下 latest 时未接受到数据,保证该消费者在启动状态,使用生产者继续生产 10 条数据,总数据为 40 条。
1.2.2 测试结果
latest
客户端取到了后生产的 10 条数据
1.2.3 测试结论
当创建一个新分组的消费者时,auto.offset.reset值为 latest 时,表示消费新的数据(从 consumer 创建开始,后生产的数据),之前产生的数据不消费。
1.3 测试三
1.3.1 测试环境
在测试环境二,总数为 40 条,无消费情况下,消费一批数据。运行消费者消费程序后,取到 5 条数据。
即,总数为 40 条,已消费 5 条,剩余 35 条。
1.3.2 测试结果
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 异常。
1.3.3 测试结论
earliest 当分区下有已提交的 offset 时,从提交的 offset 开始消费;无提交的 offset 时,从头开始消费。
latest 当分区下有已提交的 offset 时,从提交的 offset 开始消费;无提交的 offset 时,消费新产生的该分区下的数据。
none 当该 topic 下所有分区中存在未提交的 offset 时,抛出异常。
1.4 测试四
1.4.1 测试环境
再测试三的基础上,将数据消费完,再生产 10 条数据,确保每个分区上都有已提交的 offset。
此时,总数为 50,已消费 40,剩余 10 条
1.4.2 测试结果
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
1.4.3 测试结论
值为 none 时,topic 各分区都存在已提交的 offset 时,从 offset 后开始消费;只要有一个分区不存在已提交的 offset,则抛出异常。
2.不同分组下测试
2.1 测试五
2.1.1 测试环境
在测试四环境的基础上:总数为 50,已消费 40,剩余 10 条,创建不同组的消费者,组名为 testother7
2.1.2 测试结果
earliest
消费 50 条数据,即将全部数据消费完。
latest
消费 0 条数据。
none
抛出异常
2.1.3 测试结论
组与组间的消费者是没有关系的。
topic 中已有分组消费数据,新建其他分组 ID 的消费者时,之前分组提交的 offset 对新建的分组消费不起作用。
作者:lishuangzhe7047
来源:CSDN
原文:https://blog.csdn.net/lishuangzhe7047/article/details/74530417
版权声明:本文为博主原创文章,转载请附上博文链接!