Kafka是通过哪些机制提高吞吐量

磁盘、内存、网络IO

磁盘顺序读写

  1. 充分利用磁盘预读,避免随机读写造成磁盘寻道造成的开销

零拷贝

  1. Kafka是消息中转站,无需对消息进行加工处理
  2. 使用零拷贝技术,磁盘加载到直接内存,不进入JVM中,避免了CPU对数据进行内存拷贝:磁盘->内核态内存->Socket缓冲区(数据描述信息)->网卡
  3. 零拷贝技术可避免额外的内核态和用户态的切换,只需要 用户态->内核态->用户态 两次切换
  4. 数据不进入JVM也意味着无需创建对象,可减少GC

分区分段+索引

  1. 文件的操作会对文件加锁,使得文件线程独占
  2. 分区数据落盘时,文件分段存储,可以多线程并发读写
  3. 根据索引文件找到消息在哪个分段中
  4. 如果消息在缓存页中即被读取,将直接在缓存页中获取

批量读写和压缩

  1. 消息生产者依赖实现中,消息先进入双端队列,后将多条消息打包发送kafka
  2. 消息发送前会对数据进行压缩,降低带宽占用

消息写入页存后再刷盘

  1. Kafka消息先写入页存(PageCache)后,再同步或异步刷盘,可提高吞吐量
  2. 缺点是服务器系统奔溃、断电等原因可能造成部分Broker数据丢失