快捷搜索: 王者荣耀 脱发

Kafka Consumer auto.offset.reset 理解

先来一下 kafka 官网对于 auto.offset.reset 的解释: 上面的描述挺准确的,但如果没有相关背景会感觉很懵逼。网上也有很多文章讲这个东西并给了很多例子,看了之后总感觉没有理解清楚。

先来看一下怎么查看消费者 group 的 offset 情况: 每个 consumer group 会为每个消费的 partition 保存 offsets,这些 offsets 被保存在 kafka 的内部 topic:__consumer_offsets。 假设有一个 group:demo-consumer-group 和一个 topic:demo-topic,并且只有一个分区,先向其中发送两条消息。

运行 kafka 的管理脚本:

bin/kafka-consumer-groups.sh --describe --bootstrap-server 127.0.0.1:9092 --group demo-consumer-group

重点:下面的描述都是针对一个消费者 group 的,不同消费者 group 的 CURRENT-OFFSET、LOG-END-OFFSET、LAG 将会重新计算。

这个 partition 有两条消息,所以 LOG-END-OFFSET 是 2。 当有消费者 A 来消费这个分区的时候,auto.offset.reset 被设置成 latest,因为还没有正确设置 offset,这个消费者不会消费之前的消息,从 CURRENT-OFFSET 可以看出来。LAG 表示当前消费者还剩多少消息没有消费。

这里有个数据丢失的场景, 当这个消费者 A 收到第三条消息的时候,如果处理失败没有提交 offset,LOG-END-OFFSET 变成了 3,但是 CURRENT-OFFSET 还是未设置。这个时候发生重平衡,消费者 B 被分配到来消费这个分区的消息,消费者 B 也是消费不到第三个消息的。

当消费者正常消费消息后,CURRENT-OFFSET 将会被设置,即使消费者停了也是有这个记录的。当有新的消费者重新启动开始消费的时候,如果 CURRENT-OFFSET 有值,auto.offset.reset 设置成什么已经不重要了,都将会从 CURRENT-OFFSET 的下一个 offset 进行消费。

所以 auto.offset.reset 这个配置的设置是跟 CURRENT-OFFSET 是有关系的,如果 CURRENT-OFFSET 没有设置值,那 earliest 就从这个 partition 从头到尾开始消费,latest 不会消费消息,如果 CURRENT-OFFSET 有值,就是 CURRENT-OFFSET 指向的下一个 offset 开始消费。

有了这个知识点,应该可以看懂这篇博客了:

所以当新开一个 消费者组的时候如果使用了 earliest 的话,会消费那个 partition 之前的所有消息,那就需要考虑数据的容量和消费资源是否足够的影响了。

参考:

经验分享 程序员 微信小程序 职场和发展