业务开发算法 50 讲
黄清昊
Hashdata 数据库内核工程师,LeetCode 高赞答主,公众号微扰理论作者
23292 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 51 讲
业务开发算法 50 讲
15
15
1.0x
00:00/00:00
登录|注册

09|二分:如何高效查询Kafka中的消息?

Kafka消息索引查询
猜数字游戏
根据比较结果调整搜索范围
循环中选择中间值进行比较
使用left和right下标表示搜索范围
InnoDB的B+Tree索引与Kafka稀疏索引的比较
线性索引文件与复杂索引结构的优劣
为什么需要复杂索引结构如红黑树、B+树?
一次计算帮助后续查询操作
通过建立索引或排序预处理
优化查询效率
加速查询过程
采用冷热分区的二分查询算法优化性能
indexSlotRangeFor函数用于检索目标值
核心代码在AbstractIndex.scala
索引文件采用稀疏不连续的方式存储
索引文件内容是固定大小的记录
.index文件关联消息offset和文件position
每条消息有一个对应的offset
按写入时间顺序追加在日志文件中
示例代码
查找范围内的元素必须是有序排列的
相比线性查找,效率更高
时间复杂度为O(logN)
每次比较缩小搜索范围一半
在有序数组中查找特定元素的算法
讨论
问题
空间换时间
索引文件的作用
Kafka源码实现
Kafka索引文件
Kafka日志存储
实现
先决条件
优势
定义
课后作业
工程应用
Kafka索引查询
二分查找

该思维导图由 AI 生成,仅供参考

你好,我是微扰君。
今天我们来学习另一个常用的算法思想,二分法。这个算法思想相信即使你没有什么开发经验也不会感到陌生,而且之前讲红黑树的时候我们也简单聊过。
不知道你有没有玩过“猜数字”的游戏。大家规定一个范围,一个人在心里想一个这个范围内的具体数字,比如一个 1-100 的自然数,然后另几个人来猜数字;每次猜错,这个人都会提示他们的猜测是大了还是小了,看谁最快猜到数字。
如果你做这个游戏会怎么猜呢?从 1 开始顺次猜吗?我反正不会这么猜,出于一个很简单的直觉,如果 1 猜错了,那么出题的同学给你的提示对可选范围的缩小非常有限,也就是从 1-100 变成了 2-100。
我想很多人第一反应也都会是从比较中间的位置,比如 50,开始猜起。毕竟如果 50 猜错了,因为要提示是大了还是小了,范围就要么缩小到 1-49,要么缩小到 51-100,这样猜测范围就可以成倍的缩小。
所以,如果每一次我们都猜测可能范围内的中间值,那么即使猜错了也能成倍的缩小范围,这样的策略其实就是二分查找算法
有了二分查找算法,即使更大的范围内进行游戏,比如在 1-1,000,000 的范围内,我们按照二分的策略,最多也只需要 20 次即可完成任意数字的猜测,这是遍历数字猜测所远远做不到的。可以看下图有一个直观的认知。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Kafka中的二分查找算法应用 Kafka作为一款性能强大且常用的分布式消息队列,其存储消息的日志文件采用了分片和索引的方式。本文通过生动的例子和代码实现,深入浅出地介绍了Kafka中二分查找算法的原理和应用。通过对索引文件的分析,展示了二分查找在快速定位消息在日志文件中位置的重要性。文章还详细解释了Kafka中二分查找算法的优化策略,包括冷热分区的二分查询算法,以及基于mmap技术将磁盘文件映射到虚拟内存空间的实现方式。这些优化策略有效地提高了算法的性能和效率。此外,文章指出了在工程中应用算法需要充分了解计算机基础知识和操作系统的运行原理,才能真正写出高性能的代码。通过Kafka中的实际应用案例,生动地展示了二分查找算法在工程中的重要性和实际价值。 文章还提出了一个问题:为什么在许多情况下,我们还需要使用诸如红黑树、B+树这样的复杂索引结构呢?比如InnoDB的索引文件就采用了B+Tree,它和Kafka所选择的顺序稀疏索引文件各有什么优劣呢?这个问题引发了对不同索引结构的讨论,为读者提供了更多思考和探索的空间。 通过本文的总结,读者可以快速了解Kafka中二分查找算法的应用,以及在工程中的重要性和实际价值。同时,读者也被引导思考不同索引结构的优劣,为进一步学习和探索提供了思路。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《业务开发算法 50 讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(9)

  • 最新
  • 精选
  • 西门吹牛
    B+ 树就是为了磁盘存储而生,可以减少磁盘的访问次数,同时也可提供顺序访问,Kafka 采用顺序稀疏索引文件,同一分区的 log 都是顺序写的,采用稀疏索引,一方面节省空间,只要找个开始的位置,顺序遍历即可,这也和场景有关,消息是按分区顺序写入,消费端是按分区顺序成批拉取,二分找到起始位置,顺序读取即可,读写磁盘都是分区内顺序读写

    作者回复: 写得很好~

    2022-01-22
    4
  • 第一装甲集群司令克莱斯特
    应该整理一下常用中间件的索引类型 MySQL innodb: B+ Tree Oracle/Mongodb:B Tree ES:倒排索引 Kafka:稀疏索引 这节还学到了热区,冷区,还有缺页中断。

    作者回复: 整理的不错 还有一种叫 log merge structure tree 的存储类型 我们之后也会讲解~

    2022-01-03
    2
  • Paul Shan
    索引文件和红黑树查询量级是一样的,都是log n,索引文件实现简单,红黑树实现复杂,红黑树可以插入删除,合并起来可以对一个节点Key做任意变化,索引文件对于频繁的插入删除,效率会退化,最后往往需要O(n)的复杂度去重建索引,代价比较大。

    作者回复: 说得没错;所以在日志文件这种只追加不修改的场景下就很合适。

    2021-12-30
    1
  • 宋照磊
    我的理解稀疏索引对应的场景是因为经常要顺序批量查询,而MySQL常用于随机查询,所以用树结构

    作者回复: 相比于树更重要的原因在于树支持删改,而线性索引删改成本很高。 至于顺序查询,B+ Tree 叶子结点间有链接,也可以顺序批量查询。我们之后会讲解。 可以加微信 constant_variation 一起学习~

    2022-01-04
  • 对方正在输入。。。
    老师我是这样理解的:稀疏索引的方式和b➕树比起来最大的不同是稀疏索引把所有索引都放到一层,b➕树有m层,所以这样看起来洗漱索引优点是实现简单,但是不利于大数据量的存储,如果量很大,导致这一层的索引文件太多,会严重影响这一层的二分查找的效率。消息队列的消息存活一般都有一定时间限制的,kafka就是默认7天有效,单个partition的数据量一般都不会太大,就算如果量太大也可以采用横向扩展分片树的方式来控制每个partition的数据量上限。消息队列的这一特性保证了单个partition的数据量上限,所以选择了实现简单的稀疏索引

    作者回复: 其实和b+树相比更重要的区别不在于是否稀疏;而在于b+树索引可以支持数据的改动,但线性的索引表在修改的时候会带来很大的成本;但是在日志存储这种只追加不删除的场景里,就很合适。

    2022-01-02
    2
  • get: 冷热分区 + 二分查找。 感觉自己还得再补补计算机基础了。

    作者回复: 哈哈哈 这个冷热分区确实比较难想到;kafka官方也没有什么动作直到社区有人提出才意识到;并且从讨论中可以看出,PMC对底层系统的认识也是有盲区的;所以不用担心哦 一直学习就可以了~

    2021-12-30
  • SevenHe
    二分查找其实除了用于算法和工程实战以外,解决实际问题的时候也可以考虑采用二分查找的思想,比如快速定位Bug的位置
    2022-03-24
    3
  • 拓山
    1、B+树支持范围查、顺序查等能力,且由于索引层级少,很适合磁盘文件读的场景,但数据库的写能力没有kafka要求那么高。 2、kafka的特性是快!因此它不能严格按照B+那种严格的存储顺序去写入。它采用的稀疏hash、追加文件方式都是突出写入快读取快的性能,但它就不能做范围查询、索引查询了。
    2023-08-09归属地:浙江
    1
  • 雨落~紫竹
    第一 修改 第二 只有叶子结点存储数据
    2022-07-11
收起评论
显示
设置
留言
9
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部