通过 Offset 从存储层中获取 Message 大致分为两步:
- 第一步,根据 Offset 找到所属的 Segment 文件
- 第二步,从 Segment 中获取对应 Offset 的消息数据
第一步可以直接根据 Segment 的文件名进行查找(上面已经介绍了 Segment 的文件面就是它包含的数据的起始 Offset )。
第二步则需要一些
索引信息
来快速定位目标数据在 Segment 中的位置,否则就要读取整个 Segment 文件了,这里需要的索引信息就是上面的 index 文件存储的内容。
索引文件中包含多个索引条目,
每个条目表示数据文件中一条 Message 的索引
。索引包含两个部分(均为4个字节的数字),分别为相对 offset 和 position, 如下内容所示:
[root@hlinkui bin]$ ./kafka-run-class.sh kafka.tools.DumpLogSegments --files \
../kafkaLog/lyz-0/00000000000000000000.index --print-data-log
offset: 9 position: 13713
offset: 15 position: 27799
offset: 21 position: 43149
offset: 27 position: 58432
index
文件中存储的是
Offset
和
Position
(Offset 对应的消息在 log 文件中的偏移量)的对应关系,这样当有 Offset 时可以快速定位到 Position 读取
BatchRecord
,然后再从
BatchRecord
中获取某一条消息。
比如上述
Offset21
会被定位到
27
这个
BatchRecord
,然后再从这个
BatchRecord
中取出第二个
Record
(27 这个BatchRecord包含了 27 、28 两个 Record)。
Kafka 并不会为每个 Record 都保存一个索引,而是根据 log.index.interval.bytes 等配置 构建稀疏索引信息。文章来源:https://www.toymoban.com/news/detail-439976.html
Kafka 中还维护了 timeindex,保存了 Timestamp 和 Offset 的关系,在一些场景需要根据 timestamp 来定位消息。timeindex 中的一个( timestampX,offsetY )元素的含义是所有创建时间大于 timestampX 的消息的 Offset 都大于 offsetY。文章来源地址https://www.toymoban.com/news/detail-439976.html
到了这里,关于如何根据 offset 找到对应的 Message?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!