中年|做开发的到底要不要掌握算法?需要掌握到什么程度?
本文插图
本文来自作者投稿 , 原作者:Yes
很多人会有这样的疑问 , 我是一个做后端开发的 , 我要不要掌握算法?应该掌握到什么程度?掌握算法有什么应用场景呢?
这篇文章不给你讲大道理 , 从我们常用的Kafka索引入手 , 来讲述算法在工程上基于场景的灵活运用 。
索引的重要性 索引对于我们来说并不陌生 , 每一本书籍的目录就是索引在现实生活中的应用 。 通过寥寥几页纸就得以让我等快速查找需要的内容 。 冗余了几页纸 , 缩短了查阅的时间 。 空间和时间上的互换 , 包含着宇宙的哲学 。
工程领域上数据库的索引更是不可或缺 , 没有索引很难想象如此庞大的数据该如何检索 。
明确了索引的重要性 , 咱再来看看索引在Kafka里是如何实现的 。
索引在Kafka中的实践 Kafka中有三大类索引:位移索引、时间戳索引和已中止事务索引 。 分别对应了.index、.timeindex、.txnindex文件 。
与之相关的源码如下:1、AbstractIndex.scala:抽象类 , 封装了所有索引的公共操作2、OffsetIndex.scala:位移索引 , 保存了位移值和对应磁盘物理位置的关系3、TimeIndex.scala:时间戳索引 , 保存了时间戳和对应位移值的关系4、TransactionIndex.scala:事务索引 , 启用Kafka事务之后才会出现这个索引(本文暂不涉及事务相关内容)
本文插图
【中年|做开发的到底要不要掌握算法?需要掌握到什么程度?】先来看看AbstractIndex的定义
AbstractIndex的定义在代码里已经注释了 , 成员变量里面还有个entrySize 。 这个变量其实是每个索引项的大小 , 每个索引项的大小是固定的 。
entrySize 在OffsetIndex中是override def entrySize = 8 , 8个字节 。 在TimeIndex中是override def entrySize = 12,12个字节 。
为何是8 和12? 在OffsetIndex中 , 每个索引项存储了位移值和对应的磁盘物理位置 , 因此4+4=8 , 但是不对啊 , 磁盘物理位置是整型没问题 , 但是AbstractIndex的定义baseOffset来看 , 位移值是长整型 , 不是因为8个字节么?
因此存储的位移值实际上是相对位移值 , 即真实位移值-baseOffset的值 。
相对位移用整型存储够么?够 , 因为一个日志段文件大小的参数log.segment.bytes是整型 , 因此同一个日志段对应的index文件上的位移值-baseOffset的值的差值肯定在整型的范围内 。
为什么要这么麻烦 , 还要存个差值?
1、为了节省空间 , 一个索引项节省了4字节 , 想想那些日消息处理数万亿的公司 。
2、因为内存资源是很宝贵的 , 索引项越短 , 内存中能存储的索引项就越多 , 索引项多了直接命中的概率就高了 。 这其实和MySQL InnoDB 为何建议主键不宜过长一样 。 每个辅助索引都会存储主键的值 , 主键越长 , 每条索引项占用的内存就越大 , 缓存页一次从磁盘获取的索引数就越少 , 一次查询需要访问磁盘次数就可能变多 。 而磁盘访问我们都知道 , 很慢 。
互相转化的源码如下 , 就这么个简单的操作:
本文插图
上述解释了位移值是4字节 , 因此TimeIndex中时间戳8个字节 + 位移值4字节 = 12字节 。
_warmEntries 这个是干什么用的?
首先思考下我们能通过索引项快速找到日志段中的消息 , 但是我们如何快速找到我们想要的索引项呢?一个索引文件默认10MB , 一个索引项8Byte , 因此一个文件可能包含100多W条索引项 。
推荐阅读
- 中子|中子的寿命到底有多长?多种方法试错,谜题亟待解决!
- 帐户|苹果发布声明:确定 Epic Games 开发账户被终止
- 人工智能|商汤科技林达华:OpenMMLab助开发者缩短AI项目路径
- 中年|北斗“一张网”可实现全天候、高精度、自主可控服务
- 中年|Python编程语言有什么独特的优势呢?
- NOFAKE无假|一天到晚说我不配套,这鞋盒到底哪里不配套?
- 中年|谈一谈我的十年机械工作经历
- 中年|弹无虚发的背后,国产弹药质量把关人,精密机床都要自叹不如
- 中年|宿迁深圳招商再结硕果,签约项目19个,协议总投资158亿元
- 拼多多|越补越疯狂!拼多多瞄准文教领域,一招要让学生党省钱到底