Kafka中是持久化的,不用担心数据丢失问题,但由于Consumer在消费过程中可能会出现断电宕机等故障,
Consumer恢复以后,需要从故障前的位置继续消费,所以Consumer需要实时记录自己消费的offset位置,以便故障恢复后可以继续消费。
在早期的版本中,消费者将消费到的offset维护zookeeper中,consumer每间隔一段时间上报一次,这里容易导致重复消费,且性能不好!
在新的版本中消费者消费到的offset已经直接维护在kafk集群的__consumer_offsets这个topic中!
Kafka0.9版本之前,consumer默认将 offset 保存在zookeeper中,
0.9版本之后,consumer默认将offset保存在kafka一个内置的topic中,该topic为__consumer_offsets
# 利用__consumer_offsets读取数据
partition划分为多组segment,每个segment又包含.log、.index、.timeindex文件,存放的每条message包含offset、消息大小、消息体……
消费者如何通过offset获取消息:利用 segment+有序offset+稀疏索引+二分查找+顺序查找等多种手段来高效的查找数据!
1、先找到offset的368801 message所在的segment文件(利用二分法查找),这里找到的就是在第二个segment文件。
2、打开找到的segment中的.index文件(也就是368796.index文件,该文件起始偏移量为368796+1,
我们要查找的offset为368801的message在该index内的偏移量为368796+5=368801,所以这里要查找的相对offset为5)。
由于该文件采用的是稀疏索引的方式存储着相对offset及对应message物理偏移量的关系,所以直接找相对offset为5的索引找不到,
这里同样利用二分法查找相对offset小于或者等于指定的相对offset的索引条目中最大的那个相对offset,所以找到的是相对offset为4的这个索引。
3、根据找到的相对offset为4的索引确定message存储的物理偏移位置为256。
打开数据文件,从位置为256的那个地方开始顺序扫描直到找到offset为368801的那条Message。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。