人人皆知kafka性能好,但真正了解原因的人就少了很多。说起来也是悲伤的故事,我的某次面试就凉在此题。那么从设计的角度看,kafka是如何实现高性能的呢?
1.写得快
Kafka会把消息写入到硬盘,绝对不会丢失数据。为了优化写入速度Kafak采用了两个技术, 顺序写入 和 MMFile
顺序写入
因为硬盘是机械结构,寻址是最耗时的。所以硬盘最“讨厌”随机I/O,最喜欢顺序I/O,Kafka就是使用顺序I/O。

每一个Partition其实都是一个文件 ,收到消息后Kafka会把数据插入到文件末尾(虚框部分)。
Memory Mapped Files
Kafka的数据并 不是实时的写入硬盘,它充分利用了现代操作系统 分页存储 来利用内存提高I/O效率。操作系统会选择适当的时机将数据写入硬盘。
缺点就是 不可靠,写到mmap中的数据并没有被真正的写到硬盘,操作系统会在程序主动调用flush的时候才把数据真正的写到硬盘。
Kafka提供了一个参数——producer.type来控制是不是主动flush,如果Kafka写入到mmap之后就立即flush然后再返回Producer叫 同步 (sync);写入mmap之后立即返回Producer不调用flush叫 异步 (async)。
2.读得快
cosumer向broker索要消息时,kafka使用 零拷贝(zero-copy) ,建立一个磁盘空间和内存的直接映射,数据不再复制到“用户态缓冲区”,直接复制到socket缓冲区


网友评论