前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >kafka-消费索引(offset)

kafka-消费索引(offset)

原创
作者头像
Get
发布2024-03-10 20:30:19
1320
发布2024-03-10 20:30:19
代码语言:java
复制
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。

clipboard.png
clipboard.png

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档