总结

作者: d9610fcd3279 | 来源:发表于2019-03-17 00:49 被阅读0次

简单总结 kafka Service端设计 

我们知道 kafka 有 高吞吐,高可用,低延迟,允许多次消费 等特性,下面来分析kafka是怎么做的

一. 高吞吐利器之 磁盘顺序写

在这之前,我们先了解一下磁盘的读写数据方式。

1:磁盘收到系统信号读数据时,磁头会先移动扫描到数据所在磁道,(寻道时间)。

2:磁盘旋转到数据所在的扇区,(旋转时间)

3:数据开始传输 (传输时间)

磁盘多谢数据就由这3部分时间组成,kafka采用磁盘顺序写,将寻道时间和旋转时间缩短到几乎没有,我们想一想,每次读写数据磁头和磁盘只需要稍微移动一点点就能找到对应数据,er磁盘的传输性能在没有寻道和旋转的情况下是非常快的,根据Kafka官方给出的数据,在7200rpm/s的SATA RAID-5磁盘阵列上进行顺序写入速度达到600MB/sec

二、Page Cache与Memory Map 

在现代操作系统中,为了弥补硬盘写入的速度的不足,系统越来越激进的使用内存作为文件系统的缓存,甚至会使用所有空闲的内存作为磁盘缓存(即page cache)。

Kafka并没有使用常规的磁盘操作,而是使用了Memory-mapped files。当使用Memory-mapped files时,系统内核会将程序的virtual memory直接映射到page cache,避免了数据在内核空间和用户空间之间复制也避免了使用java对象带来的一些问题,从而极大提高了Kafka读写效率。

三、Zero-Copy

使用page cache和高效的memory-mapped files,避免对磁盘进行直接操作。按道理来讲,性能上应该非常出色了。但是尽管如此,还是有两个问题影响着系统的性能:频繁的小数据量网络IO操作和过多的字节拷贝。

为了避免频繁的网络往返带来的性能开销,Kafka将消息组合在一起形成一个“消息集”。使用这种方式可以将消息分批发送,而不是单条发送,从而分摊了网络往返的开销。当数据量巨大的时候,这种方式可以极大的提升网络IO的性能。Kafka的生产者和消费者都是采用这种方式向Kafka发送数据和从Kafka拉取数据的。

由下图我们可以看到,如果要将磁盘上的数据发送出去,需要经过以下四个步骤:

1:操作系统读数据并写入到page cache中    

2:应用程序

相关文章

网友评论

      本文标题:总结

      本文链接:https://www.haomeiwen.com/subject/uyoppqtx.html