目录
一、前言
1.1 为啥要琢磨kafak这么快
面试常考问题,也是一个很考察对kafka理解深度的问题。坦白地说,这个问题我也回答不好。以前我的回答说白了就是网上背下来的,就是kafka是对使用系统内核直接将数据写到磁盘上,然后磁盘的顺序写速度比较快,所以刷写数据块,这个回答太糙了。
深层次的需求:为啥kafka可以这么快,究竟是咋设计的,搞来看看。不是都说从优秀源码学习编程效率高么,那就学学呗。
1.2 研究kafka这么快需求准备的材料
- kafka官网
- kafka源码
- 百度翻译或谷歌翻译
二、kafka 数据持久化为啥快
友情提示:这一段都是我根据官方文档理解的,不到位,诸位看官请移步官方文档。
kafka综合了消息队列、消息中间件、数据存储的混合产品,必然对数据持久化要求比较高。尽管如此,kafka和其他例如DFS什么的,没有开发自己的filesystem系统,而是直接使用系统原生的filesystem。这个就比较有趣了,因为我们正常使用经验来说,本地磁盘是不慢,难道就能满足kafka千万级吞吐的要求么,我也很好奇。
那这个时候,kafka的官方文档撩了一句话说,磁盘这个东西,跑得快,全看程序员的设计能力。要是设计得当的话,磁盘的速度能和网络传输一样快。为什么这么说,那是因为磁盘快不快,全看磁盘寻道的时间。这个地方太抽象,一个彩图看一下,一个灰图。这两张图片描述的都是一个东西,我这边简单用语言描述一下。
下面这个是一个磁盘的物理结构图,为啥叫磁盘,因为中间那个盘上面有磁力,所以叫磁盘,也就是非易失型存存储,也就是掉电了数据还在。看图说话,中间那个spindle叫做轴把打了一个孔的platter也就是磁盘固定住,axis就是一个活动轮子带一个杆子,杆子前面是一个磁头,就来回扫。每次,从磁盘读数据时候,这个磁头就去扫。看看这个结构是不是有点像一个什么东西,像一个唱片机。
磁盘读数据大概就是这个过程噻。不同的是磁盘是有很多个盘叠在一起,而且每个盘上被划了很多个同心圆,每个同心圆,又划分成几个小段。
![](https://i-blog.csdnimg.cn/blog_migrate/ba2a845f7613e9a5a4126725622744ac.gif)
那么我们下面再看一下磁盘的数据存储过程细节,首先是磁盘上面画了很多道圈圈,每个圈圈里面有划分出成一段段扇形,那么每一个扇形就是存储数据的地方。那从磁盘上拿数据的简化过程就是,我的磁头先去放到那个数据所在的track上,我再去那个track上找对应的sector。
那接下来就是大胆分析一下,磁盘读取数据快慢的问题,显然数据读取快慢取决于两个因素:
- 磁头读到的数据发送计算机内存的时间
- 磁头寻找数据所在轨道的时间,。找到轨道,在轨道上转圈圈找对应数据存储的sector时间。
放飞一下想象,如果一个数据存储在多个同心圆上,或者是不同platter的同心圆上,那磁头转来转去,转到了还要再画圈圈找,那岂不是很浪费时间。
kafka是采用pagecache的方法减少内存拷贝,使用direct IO直接进行磁盘数据刷写。即便这样还要进行性能优化,就是kafka程序刷写的数据都是字节流的形式,不是object。这也有效减少了内存消耗。