先来一下 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 开始消费。
有了这个知识点,应该可以看懂这篇博客了:
Kafka auto.offset.reset值详解
所以当新开一个 消费者组的时候如果使用了 earliest 的话,会消费那个 partition 之前的所有消息,那就需要考虑数据的容量和消费资源是否足够的影响了。
参考:
Kafka Consumer Auto Offset Reset
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
网站题目:KafkaConsumerauto.offset.reset理解-创新互联
当前URL:http://lswzjz.com/article/dcjpdi.html