Kafka把所有消息都变成一个批量的文件,并且进行合理的批量压缩,减少网络IO损耗。写数据的时候由于单个Partion是末尾添加所以速度最优,同时通过Memory Mapped Files提高I/O速度,读数据的时候使用sendfile提高效率。
kafka的消息是保存或缓存在磁盘上的,即使是普通的服务器,Kafka也可以轻松支持每秒百万级的写入请求,远超大部分的消息中间件。
为什么不适用内存存储?
kafka是由Scala和Java编写的,如果使用内存做存储的话虽然效率高,但是需要解决两个问题
1)JAVA对象的内存开销
2)java的gc
使用磁盘的话,可以很好的避免以上两点问题,在使用顺序读写的情况下保持可效率,同时解决了内存开销和gc问题,最重要的是一旦机器重启后不会丢失数据。
下面从读写两个方面分别分析下kafka为什么这么快
一、写数据
Kafka把收到的消息都写入到硬盘中(不会丢失数据),之所以能够提高kafka优化写入效率,kafka采取了以下几种方法。
顺序写入
因为硬盘是机械结构,每次读写都会寻址(最耗时)->写入,所以硬盘最讨厌随机I/O,最喜欢顺序I/O。为了提高读写硬盘的速度,Kafka就是使用顺序I/O。在顺序读写的情况下,某些优化场景磁盘的读写速度可以和内存持平。
对于kafka来说,每一个Partition其实都是一个文件 ,收到消息后Kafka会把数据插入到文件末尾。
不维护数据的状态
kafka不维护信息的状态,每个消费者