放荡的人生|面试题详解:Kafka为什么能那么快的6个原因

无论 Kafka 作为 MQ 也好 , 作为存储层也罢 , 无非就是两个功能(好简单的样子) , 一是 Producer 生产的数据存到 broker , 二是 Consumer 从 broker 读取数据 。 那 Kafka 的快也就体现在读写两个方面了 , 下面我们就聊聊 Kafka 快的原因 。
放荡的人生|面试题详解:Kafka为什么能那么快的6个原因1. 利用 Partition 实现并行处理我们都知道 Kafka 是一个 Pub-Sub 的消息系统 , 无论是发布还是订阅 , 都要指定 Topic 。
Topic 只是一个逻辑的概念 。 每个 Topic 都包含一个或多个 Partition , 不同 Partition 可位于不同节点 。
一方面 , 由于不同 Partition 可位于不同机器 , 因此可以充分利用集群优势 , 实现机器间的并行处理 。 另一方面 , 由于 Partition 在物理上对应一个文件夹 , 即使多个 Partition 位于同一个节点 , 也可通过配置让同一节点上的不同 Partition 置于不同的磁盘上 , 从而实现磁盘间的并行处理 , 充分发挥多磁盘的优势 。
能并行处理 , 速度肯定会有提升 , 多个工人肯定比一个工人干的快 。
“可以并行写入不同的磁盘?那磁盘读写的速度可以控制吗?
那就先简单扯扯磁盘/IO 的那些事
放荡的人生|面试题详解:Kafka为什么能那么快的6个原因“硬盘性能的制约因素是什么?如何根据磁盘I/O特性来进行系统设计?
硬盘内部主要部件为磁盘盘片、传动手臂、读写磁头和主轴马达 。 实际数据都是写在盘片上 , 读写主要是通过传动手臂上的读写磁头来完成 。 实际运行时 , 主轴让磁盘盘片转动 , 然后传动手臂可伸展让读取头在盘片上进行读写操作 。 磁盘物理结构如下图所示:
放荡的人生|面试题详解:Kafka为什么能那么快的6个原因
由于单一盘片容量有限 , 一般硬盘都有两张以上的盘片 , 每个盘片有两面 , 都可记录信息 , 所以一张盘片对应着两个磁头 。 盘片被分为许多扇形的区域 , 每个区域叫一个扇区 。 盘片表面上以盘片中心为圆心 , 不同半径的同心圆称为磁道 , 不同盘片相同半径的磁道所组成的圆柱称为柱面 。 磁道与柱面都是表示不同半径的圆 , 在许多场合 , 磁道和柱面可以互换使用 。 磁盘盘片垂直视角如下图所示:
放荡的人生|面试题详解:Kafka为什么能那么快的6个原因影响磁盘的关键因素是磁盘服务时间 , 即磁盘完成一个I/O请求所花费的时间 , 它由寻道时间、旋转延迟和数据传输时间三部分构成 。
机械硬盘的连续读写性能很好 , 但随机读写性能很差 , 这主要是因为磁头移动到正确的磁道上需要时间 , 随机读写时 , 磁头需要不停的移动 , 时间都浪费在了磁头寻址上 , 所以性能不高 。 衡量磁盘的重要主要指标是IOPS和吞吐量 。
在许多的开源框架如 Kafka、HBase 中 , 都通过追加写的方式来尽可能的将随机 I/O 转换为顺序 I/O , 以此来降低寻址时间和旋转延时 , 从而最大限度的提高 IOPS 。
感兴趣的同学可以看看 磁盘I/O那些事[1]
磁盘读写的快慢取决于你怎么使用它 , 也就是顺序读写或者随机读写 。
2. 顺序写磁盘
放荡的人生|面试题详解:Kafka为什么能那么快的6个原因Kafka 中每个分区是一个有序的 , 不可变的消息序列 , 新的消息不断追加到 partition 的末尾 , 这个就是顺序写 。