offset是什么?
对于每一个topic, Kafka集群都会维持一个分区日志
每个分区都是有序且顺序不可变的记录集,并且不断地追加到结构化的log文件。分区中的每一个记录都会分配一个id号来表示顺序,我们称之为offset,offset用来唯一的标识分区中每一条记录。
offset有什么用?
消费者在消费数据时,发生宕机后,再次重新启动后,消费的数据需要从宕机位置开始读取
- 如果从头读取,有一部分消息一定出现了重复消费
- 如果从宕机时的消费位置读取,就不会出现重复消费
因此kafka设计了offset可以用于处理这种情况
如何维护offset的数值?
有两种方式,
-
自动提交,设置
enable.auto.commit=true
,更新的频率根据参数【auto.commit.interval.ms】来定。这种方式也被称为【at most once
】,fetch到消息后就可以更新offset,无论是否消费成功。默认就是true -
手动提交,设置
enable.auto.commit=false
,这种方式称为【at least once
】。fetch到消息后,等消费完成再调用方法【consumer.commitSync()
】,手动更新offset;如果消费失败,则offset也不会更新,此条消息会被重复消费一次
offset实体在什么位置?
0.9.0版本以前.这些数值维护在zookeeper中,但是zk不适合大量写入.后来做了改动
0.9.0 版本以后,数据维护在kafka的_consumer_offsets主题下.
内部结构包括
groupid:topicName_partition offset