一、前言

近日被问到Kafka根据时间戳是如何进行消息查询的,整理一圈下来后,发现涉及一些知识点,因此总结此文

二、消息落盘

要想了解kafka是如何根据时间戳查询消息的,那就需先了解消息是如何落盘的。把场景聚焦在这个点上的话,涉及的文件有3个:

  • xxxxxxxx.log
  • xxxxxxxx.index
  • xxxxxxxx.timeindex

可以拿我本机中topic2第0号partition举例:

xxxxxxxx.log文件不用多说,这个属于Kafka的SOT(Source Of True),消息的header、body均存储在这个文件

xxxxxxxx.index 文件,就是大名鼎鼎的稀疏索引了,它的entry是由<offset, physicalPosition>组成的,也就是位点+其对应的文件物理位置;所谓稀疏,是指并不是每条消息都会生成一条这样的索引记录,而是xxxxxxxx.log文件每写入4K(磁盘都是4K对齐的)的数据,便会生成一条稀疏索引

xxxxxxxx.timeindex 文件,就是时间索引了,它的entry是由<timestamp, offset>组成的,也就是时间戳+位点。值得一提的是,时间索引的生成频率与稀疏索引是完全对齐的

简单贴一段索引的生成代码,可以看到这两个索引要么不写入,要么就一起写入

// 类路径: kafka/log/LogSegment.scala

// append an entry to the index (if needed)
if (bytesSinceLastIndexEntry > indexIntervalBytes) {
offsetIndex.append(largestOffset, physicalPosition)
timeIndex.maybeAppend(maxTimestampSoFar, offsetOfMaxTimestampSoFar)
bytesSinceLastIndexEntry = 0
}

三、根据时间查询

查询的时候,就要用到这两个索引文件,当然这两个文件肯定不能精确定位目标消息,但是其可以帮助粗略定位

  1. 查询.timeindex文件,根据目标时间戳,查询第一个比目标时间戳小的索引(因为时间戳是升序的,因此此处使用二分查找高效定位),从而可获取到这个索引的位点信息 offsetMin
  2. 使用这个 offsetMin 位点查询.index文件,因为index索引文件也是根据offset升序的,同样使用二分查找获取对应的文件物理 position
  3. 通过 position 信息查询 .log 文件,逐步向后读取,直到找到第一个与目标时间戳相等或大于目标时间差的消息,而后返回其位点

总结:本文粗枝大叶地将按照时间戳查询消息的流程过了一遍,很多细节没有展开(尤其是涉及文件操作的),希望可以帮助大家对其有个整体概念及认识

Kafka原理浅析-根据时间戳查询消息的更多相关文章

  1. 消息系统kafka原理解析

    Kakfa起初是由LinkedIn公司开发的一个分布式的消息系统,后成为Apache的一部分,它使用Scala编写,以可水平扩展和高吞吐率而被广泛使用.目前越来越多的开源分布式处理系统如Clouder ...

  2. 消息队列——ActiveMQ使用及原理浅析

    文章目录 引言 正文 一.ActiveMQ是如何产生的? 产生背景 JMS规范 基本概念 JMS体系结构 二.如何使用? 基本功能 消息传递 P2P pub/sub 持久订阅 消息传递的可靠性 事务型 ...

  3. [转帖]Kafka 原理和实战

    Kafka 原理和实战 https://segmentfault.com/a/1190000020120043 两个小时读完... 实在是看不完... 1.2k 次阅读  ·  读完需要 101 分钟 ...

  4. Kafka原理及应用(一)

    一. Kafka简介 (1) 消息中间件的两种实现模式 JMS (Java Message Service) 对消息的发送和接收定义了两种模式: 点对点模式:消息的生产和消费者均只有一个,消息由生产者 ...

  5. kafka原理和架构

    转载自:  https://blog.csdn.net/lp284558195/article/details/80297208 参考:   https://blog.csdn.net/qq_2059 ...

  6. kafka原理和实践(三)spring-kafka生产者源码

    系列目录 kafka原理和实践(一)原理:10分钟入门 kafka原理和实践(二)spring-kafka简单实践 kafka原理和实践(三)spring-kafka生产者源码 kafka原理和实践( ...

  7. kafka原理和实践(五)spring-kafka配置详解

    系列目录 kafka原理和实践(一)原理:10分钟入门 kafka原理和实践(二)spring-kafka简单实践 kafka原理和实践(三)spring-kafka生产者源码 kafka原理和实践( ...

  8. [转帖]Git数据存储的原理浅析

    Git数据存储的原理浅析 https://segmentfault.com/a/1190000016320008   写作背景 进来在闲暇的时间里在看一些关系P2P网络的拓扑发现的内容,重点关注了Ma ...

  9. Kafka 原理和实战

    本文首发于 vivo互联网技术 微信公众号 https://mp.weixin.qq.com/s/bV8AhqAjQp4a_iXRfobkCQ作者简介:郑志彬,毕业于华南理工大学计算机科学与技术(双语 ...

  10. Apache kafka原理与特性(0.8V)

    前言: kafka是一个轻量级的/分布式的/具备replication能力的日志采集组件,通常被集成到应用系统中,收集"用户行为日志"等,并可以使用各种消费终端(consumer) ...

随机推荐

  1. Kafka入门实战教程:学习总结目录索引

    0 Kafka学习路径 在学习Kafka的途中,我总结了一个系列的Kafka学习征途系列教程,它只选取了我认为最实用的部分整理出来,以及结合我最熟悉的.NET技术栈进行了演示. 而一些我觉得在实际中用 ...

  2. MongoDB入门实战教程(11)

    前面我们学习了在MongoDB中的写操作事务管理,本篇我们开始进入读操作事务. 1 读数据关注的两个问题 在通过mongodb读取数据时,我们一般需要关注两个问题: (1)从哪里读取? (2)什么样的 ...

  3. Jfinal启动报错-文件找不到

  4. 【C#】字符串提取(获取两个字符串中间的字符串)

    [C#]字符串提取(获取两个字符串中间的字符串) https://blog.csdn.net/weixin_43553508/article/details/102673668 C#三行代码实现提取两 ...

  5. C# 通过 HttpClient 上传图片 POST

    public string PostUploadImage(string uploadUrl, string imgPath, string fileparameter = "file&qu ...

  6. 前端页面实现table可拖动改变列宽

    https://blog.csdn.net/Java_Long_Asus/article/details/87794445 此处实现页面的table表格可以自由拖动列宽,拖动时表格内文字不换行,超出部 ...

  7. 如何让FastAPI与Celery完美联姻,打造高效异步任务处理系统?

    扫描二维码 关注或者微信搜一搜:编程智域 前端至全栈交流与成长 发现1000+提升效率与开发的AI工具和实用程序:https://tools.cmdragon.cn/ Celery基础概念 Celer ...

  8. CF1967B1 Reverse Card (Easy Version) 题解

    CF1967B1 Reverse Card (Easy Version) 我们发现 \(b\times\gcd(a,b)\) 必然为 \(b\) 的倍数,那么 \(b\times\gcd(a,b)\) ...

  9. QT QSS,QML 样式学习

    QT QSS,QML 样式学习 简介 通过QT的QSS和QML定制QT的样式 参考链接 https://www.jianshu.com/p/2c7db2f6c458 https://www.cnblo ...

  10. Ansys 绘制等高线

    简介 绘制等高线 image