auto.offset.reset用来指定consumer消费策略,有如下取值:
1、latest(分区有提交的offset,从提交的offset后一个offset开始消费;否则等待新生产的数据)【默认配置】
示例:topic3有两个分区、3个副本;其中topic3-0有五条数据,offset为0~4,但是offset0~offset4未提交,验证结果如下:
指定不自动提交offset && auto.offset.reset=latest:
消费者启动后,发现未消费到数据,并且对于topic3-0分区来说HW为5:
此时再生产5条数据,可以看到,消费者消费的offset区间为5~9:
2、earliest(分区有提交的offset,从提交的offset后一个offset开始消费;否则从头开始消费)
示例:接着前面的例子,topic3-0中有10条数据,offset为0~9,验证结果如下:
配置auto.offset.reset为earliest
消费者启动,可以看到从头开始消费数据:
3、none(分区有提交的offset,从提交的offset后一个offset开始消费;否则抛出异常)
分区无已经提交的offset:
分区0内有15条数据,offset为0~14,其中offset0~offset9已经被提交;offset10~14未提交;
consumer启动后再生产5条数据,结果如下:
个人使用建议:
1、auto.offset.reset最好不要设置为latest,这是因为:如果分区内的数据未被消费过,这时消费者上线,会导致消费者无法消费到前面的数据(当然也得看应用场景,如果认为这种情况的数据就该丢失,那当我没说)
2、auto.offset.reset设置为earliest时,可能会有重复消费的问题,这就需要消费者端做数据去重处理