Kafka是通过哪些机制提高吞吐量
磁盘、内存、网络IO
磁盘顺序读写
- 充分利用磁盘预读,避免随机读写造成磁盘寻道造成的开销
零拷贝
- Kafka是消息中转站,无需对消息进行加工处理
- 使用零拷贝技术,磁盘加载到直接内存,不进入JVM中,避免了CPU对数据进行内存拷贝:磁盘->内核态内存->Socket缓冲区(数据描述信息)->网卡
- 零拷贝技术可避免额外的内核态和用户态的切换,只需要 用户态->内核态->用户态 两次切换
- 数据不进入JVM也意味着无需创建对象,可减少GC
分区分段+索引
- 文件的操作会对文件加锁,使得文件线程独占
- 分区数据落盘时,文件分段存储,可以多线程并发读写
- 根据索引文件找到消息在哪个分段中
- 如果消息在缓存页中即被读取,将直接在缓存页中获取
批量读写和压缩
- 消息生产者依赖实现中,消息先进入双端队列,后将多条消息打包发送kafka
- 消息发送前会对数据进行压缩,降低带宽占用
消息写入页存后再刷盘
- Kafka消息先写入页存(PageCache)后,再同步或异步刷盘,可提高吞吐量
- 缺点是服务器系统奔溃、断电等原因可能造成部分Broker数据丢失