深刻了解Kafka【四】消费者的Offset管理


一、Offset Topic

Consumer经过提交Offset来记录当前消费的最后位置,以便于消费者发生崩溃或者有新的消费者加入消费者组,而引起的分区再均衡操做,每一个消费者可能会分到不一样的分区。我测试的kafka版本是:0.11.0.2,消费者往一个特殊的主题“_consumer_offset”发送消息,如图: offset topic.png异步

消息的内容包括:测试

fields content
Key Consumer Group, topic, partition
Payload Offset, metadata, timestamp

提交到“_consumer_offset”主题的消息会根据消费组的key进行分区,一个消费组内的全部消息,都会发送到惟一的Partition。 offset topic-逻辑图.pngblog

二、Offset Commit

Offset的提交逻辑其实和普通的生产者往kafka发送数据是同样的。接口

2.一、Consumer

消费者启动时会为“_consumer_offset”主题建立一个内置的生产者,用于Offset数据的提交。kafka

2.二、Broker

就是将Offset提交当成是正常的生产请求,逻辑不变。 offset topic commit.png同步

“_consumer_offset”主题会在集群中的第一个Offset提交请求时被自动建立。it

三、Offset的提交方式

Offset提交时会有两个问题:重复消费和漏消费。io

  • 当提交的Offset小于客户端处理的最后一条消息的Offset,会形成重复消费。 情景:先消费,后提交Offset,若是消费成功、提交失败,消费者下次获取的Offset仍是之前的,因此会形成重复消费。
  • 当提交的Offset大于客户端处理的最后一条消息的Offset,会形成漏消费。 情景:先提交Offset,后消费,若是提交成功、消费失败,消费者下次获取的Offset已是新的,因此会形成漏消费。

根据具体的业务状况,选择合适的提交方式,能够有效的解决掉重复消费和漏消费的问题。table

3.一、自动提交

自动提交是最简单的提交方式,经过设置参数,能够开启自动提交也能够设置提交的时间间隔。缺点就是,当消费了一些数据后,还未达到自动的提交时间,这个时候,有新的消费者加入,或者当前消费者挂掉,会出现分区再均衡操做,以后消费者从新在上一次提交的Offset开始消费,形成重复消费。虽然能够缩短自动提交间隔,可是仍是没法解决这个问题。集群

3.二、同步提交当前Offset

关闭手动提交,能够经过同步提交接口来提交当前的Offset,虽然能够获取主动性,可是也牺牲了吞吐量,由于同步提交必然是阻塞的,并且会有重试机制。

3.三、异步提交当前Offset

使用异步提交方式,既有主动性,也能够增长kafka消费的吞吐量,没有重试机制,也解决不掉重复消费的问题。

3.四、同步和异步组合提交

正常使用的时候使用异步提交,速度快。当要关闭消费者的时候,使用同步提交,即便失败了也会一直重试,直到提交成功或者发生没法恢复的错误。无论是同步提交仍是异步提交都避免不了重复消费和漏消费的问题。

3.五、提交指定的Offset

由于自动提交、同步提交与异步提交都是将最后一个Offset提交上去。经过提交指定的Offset,能够减轻重复消费和漏消费的问题,可是相应的消费端就须要复杂的业务处理,并且须要本身维护Offset。

tencent.jpg

相关文章
相关标签/搜索