Kafka原理浅析-根据时间戳查询消息
一、前言
近日被问到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
}
三、根据时间查询
查询的时候,就要用到这两个索引文件,当然这两个文件肯定不能精确定位目标消息,但是其可以帮助粗略定位
- 查询
.timeindex文件,根据目标时间戳,查询第一个比目标时间戳小的索引(因为时间戳是升序的,因此此处使用二分查找高效定位),从而可获取到这个索引的位点信息 offsetMin - 使用这个 offsetMin 位点查询
.index文件,因为index索引文件也是根据offset升序的,同样使用二分查找获取对应的文件物理 position - 通过 position 信息查询
.log文件,逐步向后读取,直到找到第一个与目标时间戳相等或大于目标时间差的消息,而后返回其位点
总结:本文粗枝大叶地将按照时间戳查询消息的流程过了一遍,很多细节没有展开(尤其是涉及文件操作的),希望可以帮助大家对其有个整体概念及认识
Kafka原理浅析-根据时间戳查询消息的更多相关文章
- 消息系统kafka原理解析
Kakfa起初是由LinkedIn公司开发的一个分布式的消息系统,后成为Apache的一部分,它使用Scala编写,以可水平扩展和高吞吐率而被广泛使用.目前越来越多的开源分布式处理系统如Clouder ...
- 消息队列——ActiveMQ使用及原理浅析
文章目录 引言 正文 一.ActiveMQ是如何产生的? 产生背景 JMS规范 基本概念 JMS体系结构 二.如何使用? 基本功能 消息传递 P2P pub/sub 持久订阅 消息传递的可靠性 事务型 ...
- [转帖]Kafka 原理和实战
Kafka 原理和实战 https://segmentfault.com/a/1190000020120043 两个小时读完... 实在是看不完... 1.2k 次阅读 · 读完需要 101 分钟 ...
- Kafka原理及应用(一)
一. Kafka简介 (1) 消息中间件的两种实现模式 JMS (Java Message Service) 对消息的发送和接收定义了两种模式: 点对点模式:消息的生产和消费者均只有一个,消息由生产者 ...
- kafka原理和架构
转载自: https://blog.csdn.net/lp284558195/article/details/80297208 参考: https://blog.csdn.net/qq_2059 ...
- kafka原理和实践(三)spring-kafka生产者源码
系列目录 kafka原理和实践(一)原理:10分钟入门 kafka原理和实践(二)spring-kafka简单实践 kafka原理和实践(三)spring-kafka生产者源码 kafka原理和实践( ...
- kafka原理和实践(五)spring-kafka配置详解
系列目录 kafka原理和实践(一)原理:10分钟入门 kafka原理和实践(二)spring-kafka简单实践 kafka原理和实践(三)spring-kafka生产者源码 kafka原理和实践( ...
- [转帖]Git数据存储的原理浅析
Git数据存储的原理浅析 https://segmentfault.com/a/1190000016320008 写作背景 进来在闲暇的时间里在看一些关系P2P网络的拓扑发现的内容,重点关注了Ma ...
- Kafka 原理和实战
本文首发于 vivo互联网技术 微信公众号 https://mp.weixin.qq.com/s/bV8AhqAjQp4a_iXRfobkCQ作者简介:郑志彬,毕业于华南理工大学计算机科学与技术(双语 ...
- Apache kafka原理与特性(0.8V)
前言: kafka是一个轻量级的/分布式的/具备replication能力的日志采集组件,通常被集成到应用系统中,收集"用户行为日志"等,并可以使用各种消费终端(consumer) ...
随机推荐
- Kafka入门实战教程:学习总结目录索引
0 Kafka学习路径 在学习Kafka的途中,我总结了一个系列的Kafka学习征途系列教程,它只选取了我认为最实用的部分整理出来,以及结合我最熟悉的.NET技术栈进行了演示. 而一些我觉得在实际中用 ...
- MongoDB入门实战教程(11)
前面我们学习了在MongoDB中的写操作事务管理,本篇我们开始进入读操作事务. 1 读数据关注的两个问题 在通过mongodb读取数据时,我们一般需要关注两个问题: (1)从哪里读取? (2)什么样的 ...
- Jfinal启动报错-文件找不到
- 【C#】字符串提取(获取两个字符串中间的字符串)
[C#]字符串提取(获取两个字符串中间的字符串) https://blog.csdn.net/weixin_43553508/article/details/102673668 C#三行代码实现提取两 ...
- C# 通过 HttpClient 上传图片 POST
public string PostUploadImage(string uploadUrl, string imgPath, string fileparameter = "file&qu ...
- 前端页面实现table可拖动改变列宽
https://blog.csdn.net/Java_Long_Asus/article/details/87794445 此处实现页面的table表格可以自由拖动列宽,拖动时表格内文字不换行,超出部 ...
- 如何让FastAPI与Celery完美联姻,打造高效异步任务处理系统?
扫描二维码 关注或者微信搜一搜:编程智域 前端至全栈交流与成长 发现1000+提升效率与开发的AI工具和实用程序:https://tools.cmdragon.cn/ Celery基础概念 Celer ...
- CF1967B1 Reverse Card (Easy Version) 题解
CF1967B1 Reverse Card (Easy Version) 我们发现 \(b\times\gcd(a,b)\) 必然为 \(b\) 的倍数,那么 \(b\times\gcd(a,b)\) ...
- QT QSS,QML 样式学习
QT QSS,QML 样式学习 简介 通过QT的QSS和QML定制QT的样式 参考链接 https://www.jianshu.com/p/2c7db2f6c458 https://www.cnblo ...
- Ansys 绘制等高线
简介 绘制等高线 image