漫画面试回答kafka为什么如此之快|满分

一 磁盘读写原理
磁盘的结构图:

当须要从磁盘读取数据时,要肯定读的数据在哪一个磁道,哪一个扇区:
  • 首先必须找到柱面,即磁头须要移动对准相应磁道,这个过程叫作寻道,所耗费时间叫作寻道时间;
  • 而后目标扇区旋转到磁头下,这个过程耗费的时间叫作旋转时间;
一次访盘请求(读/写)完成过程由三个动做组成
  1. 寻道(时间):磁头移动定位到指定磁道;
  2. 旋转延迟(时间):等待指定扇区从磁头下旋转通过;
  3. 数据传输(时间):数据在磁盘、内存与网络之间的实际传输
因为存储介质的特性,磁盘自己存取就比主存慢,再加上机械运动耗费,磁盘的存取速度每每是主存的几百分之一甚至几千分支一
二 利用page cache+mmap
1.page cache
Page Cache :以Page为单位,缓存文件内容。缓存在Page Cache中的文件数据,可以更快的被用户读取。同时对于带buffer的写入操做,数据在写入到Page Cache中便可当即返回,而不需等待数据被实际持久化到磁盘,进而提升了上层应用读写文件的总体性能。 cached这列的数值表示的是当前的页缓存(page cache)的占用量,page cache文件的页数据,页是逻辑上的概念,所以page cache是与文件系统同级的
buffer cache:磁盘等块设备的缓冲,内存的这一部分是要写入到磁盘里的 。buffers列 表示当前的块缓存(buffer cache)占用量,buffer cache用于缓存块设备(如磁盘)的块数据。块是物理上的概念,所以buffer cache是与块设备驱动程序同级的。
2.什么是mmap

三 零拷贝

从系统安全和保护的角度出发,在进行计算机体系结构设计时,处理机的执行模式通常设定为两种:分别称为内核模式(内核态)和用户模式(用户态)。当处理机处于内核模式执行时,意味着系统除了能够执行通常指令外,还能够执行特权指令,便可以执行访问各类控制寄存器的指令、I/O指令以及程序状态字。
当处理机处于用户模式执行时,只能执行通常指令,而不容许执行特权指令。这样作能够保护核心代码不受用户程序有意和无心的攻击。
显然,处理机在运行期间须要在内核模式和用户模式以前进行切换。
能够发现一次IO请求操做进行了2次上下文切换和4次系统调用,而同一份数据在缓存中屡次拷贝,实际上对于拷贝来讲彻底能够直接在内核态中进行,也就是省去第2和第3步骤,变成这样:
四 存储设计
五 批量发送
六 压缩

  1. 若是每一个消息都压缩,可是压缩率相对很低,因此Kafka使用了批量压缩,即将多个消息一块儿压缩而不是单个消息压缩
  2. Kafka容许使用递归的消息集合,批量的消息能够经过压缩的形式传输而且在日志中也能够保持压缩格式,直到被消费者解压缩
  3.  Kafka支持多种压缩协议,包括Gzip和Snappy压缩协议

七 消息写的过程
生产者发送批量压缩的数据到broker,broker经过MappedByteBuffer的map()函数映射其地址到你的虚拟内存地址。接着就能够对这个MappedByteBuffer执行写入操做了,写入的时候他会直接进入PageCache中,而后过一段时间以后,由os的线程异步刷入磁盘中,能够看上面的示意图。
上图中彷佛只有一次数据拷贝的过程,他就是从PageCache里拷贝到磁盘文件里而已!这个就是你使用mmap技术以后,相比于传统磁盘IO的一个性能优化
八 消息读的过程

读取数据的时候,会先判断page cache中是否存在,存在就能够直接从page cache中消费,因此消费实时数据就会速度快不少。可是消费历史数据就不得不将历史数据从新加载到page cache,并且会污染掉page cache。
PageCache技术在加载历史数据的时候,还会将你加载的数据块的临近的其余数据块也一块儿加载到PageCache里去,这其实就是一个预读过程,对于须要连续读取历史数据的,也是性能的不小优化。
推荐阅读:
基于Groovy的规则脚本引擎实战
漫画讲解Kafka高效的存储设计|面试
漫画全面解释Spark企业调优势

本文分享自微信公众号 - 浪尖聊大数据(bigdatatip)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。面试