- 磁盘顺序读写:保证了消息的堆积
- 顺序读写,磁盘会预读,预读即在读取的起始地址连续读取多个页面,主要时间花费在了传输时间,而这个时间两种读写可以认为是一样的。
- 随机读写,因为数据没有在一起,将预读浪费掉了。需要多次寻道和旋转延迟。而这个时间可能是传输时间的许多倍。
- 零拷贝:避免 CPU 将数据从一块存储拷贝到另外一块存储的技术
- 读取磁盘文件数据到内核缓冲区
- 将内核缓冲区的数据copy到用户缓冲区
- 将用户缓冲区的数据copy到socket的发送缓冲区
- 将socket发送缓冲区中的数据发送到网卡、进行传输
- 传统的数据复制:
- 零拷贝:磁盘文件->内核空间读取缓冲区->网卡接口->消费者进程
- 分区分段+索引
Kafka的message消息实际上是分布式存储在一个一个小的segment中的,每次文件操作也是直接操作的segment。
为了进一步的查询优化,Kafka又默认为分段后的数据文件建立了索引文件,就是文件系统上的.index文件。
这种分区分段+索引的设计,不仅提升了数据读取的效率,同时也提高了数据操作的并行度
- 批量压缩:多条消息一起压缩,降低带宽
- 批量读写
- 直接操作page cache,而不是JVM、避免GC耗时及对象创建耗时,且读写速度更高,进程重启、缓存也不会丢失
© 版权声明
本站文章由不念博客原创,未经允许严禁转载!
THE END