Kafka高性能高吞吐的原因

  1. 磁盘顺序读写:保证了消息的堆积
    1. 顺序读写,磁盘会预读,预读即在读取的起始地址连续读取多个页面,主要时间花费在了传输时间,而这个时间两种读写可以认为是一样的。
    2. 随机读写,因为数据没有在一起,将预读浪费掉了。需要多次寻道和旋转延迟。而这个时间可能是传输时间的许多倍。
  2. 零拷贝:避免 CPU 将数据从一块存储拷贝到另外一块存储的技术
    1. 读取磁盘文件数据到内核缓冲区
    2. 将内核缓冲区的数据copy到用户缓冲区
    3. 将用户缓冲区的数据copy到socket的发送缓冲区
    4. 将socket发送缓冲区中的数据发送到网卡、进行传输
    5. 传统的数据复制:
    6. 零拷贝:磁盘文件->内核空间读取缓冲区->网卡接口->消费者进程
  3. 分区分段+索引

Kafka的message消息实际上是分布式存储在一个一个小的segment中的,每次文件操作也是直接操作的segment。

为了进一步的查询优化,Kafka又默认为分段后的数据文件建立了索引文件,就是文件系统上的.index文件。

这种分区分段+索引的设计,不仅提升了数据读取的效率,同时也提高了数据操作的并行度

  1. 批量压缩:多条消息一起压缩,降低带宽
  2. 批量读写
  3. 直接操作page cache,而不是JVM、避免GC耗时及对象创建耗时,且读写速度更高,进程重启、缓存也不会丢失
图片[1]-Kafka高性能高吞吐的原因-不念博客
© 版权声明
THE END