在使用Kafka的过程中,消费者断掉之后,再次开始消费时,消费者会从断掉时的位置重新开始消费。
场景再现:比如昨天消费者晚上断掉了,今天上午我们会发现kafka消费的数据不是最新的,而是昨天晚上的数据,由于数据量比较多,也不会及时的消费到今天上午的数据,这个时候就需要我们对偏移量进行重置为最新的,以获取最新的数据。
前提,我们使用的AutoOffsetReset配置是Latest,即从连接到Kafka那一刻开始消费之后产生的消息,之前发布的消息不在消费,这也是默认的配置。
关于AutoOffsetReset这个枚举的配置项如下:
latest
(default) which means consumers will read messages from the tail of the partitionearliest
which means reading from the oldest offset in the partitionnone
throw exception to the consumer if no previous offset is found for the consumer's group接下来,我们直接使用下面这一段代码即可:
使用Assign订阅指定的分区,注意最后还需要使用Subscribe方法订阅
consumer.Assign(new TopicPartitionOffset(new TopicPartition(topic, new Partition(1)),Offset.End));//从指定的Partition订阅消息使用Assign方法 consumer.Subscribe(topic);//订阅消息使用Subscribe方法
从指定的分区获取数据,并且指定了对应的偏移量
关于Offset这个枚举不同配置项的说明如下:
Offset 可以被设置为 Beginning、End、Stored 和 Unset。这些值的含义如下:
Beginning:从 Kafka 分区的最早消息(Offset 为 0)开始消费。如果分区中有新消息产生,消费者会继续消费这些消息。
End:从 Kafka 分区的最新消息开始消费。如果消费者在启动后到达了 Kafka 分区的末尾,它将停止消费,并等待新消息的到来。
Stored:从消费者存储的 Offset 开始消费。这个 Offset 通常是消费者在上次停止消费时存储的 Offset。如果存储的 Offset 失效或者已过期,消费者会从最新的消息(End)开始消费。
Unset:在消费者启动时,Offset 没有被设置。在这种情况下,消费者将根据 auto.offset.reset 配置项的值来决定从哪里开始消费。如果 auto.offset.reset 的值为 latest,则从最新的消息开始消费;如果 auto.offset.reset 的值为 earliest,则从最早的消息开始消费。
需要注意的是,如果设置了 Stored 的 Offset,但是在 Kafka 中找不到对应的消息,消费者将会从最新的消息(End)开始消费。
因此,存储的 Offset 必须要有效才能够被正确地使用