当前位置: 首页 > article >正文

Kafka高性能设计

在这里插入图片描述

  1. 高性能设计概述
    • Kafka高性能是多方面协同的结果,包括集群架构、分布式存储、ISR数据同步及高效利用磁盘和操作系统特性等。
    • 主要体现在消息分区、顺序读写、页缓存、零拷贝、消息压缩和分批发送六个方面。
  2. 消息分区
    • 存储不受单台服务器限制,能处理更多数据,数据量过大还会分段存储。
  3. 顺序读写
    • Kafka消息存储在磁盘文件中,写文件时以追加方式新增数据,顺序读写效率高(与随机读写比较,主要在于磁盘寻址过程)。
    • 顺序读写数据连续,寻址快;随机存放数据不连续,寻址耗时,查找效率低,所以磁盘顺序读写效率较高。
  4. 页缓存
    • 是Linux中的概念,类似系统缓存。读写磁盘文件时,数据先读到页缓存中再操作,提升性能。
  5. 零拷贝
    • 作用是减少磁盘IO和网络IO,是Kafka高性能非常重要的一环。

原来的模式 -> 四次数据拷贝

在这里插入图片描述

  • Linux系统划分用户空间和内核空间,用户空间权限小,内核空间权限大。
  • Kafka服务在用户空间,生产者发送消息时,数据先从用户空间拷贝到内核空间的页缓存,批量发送时再写入磁盘。
  • 消费者消费消息时,先在页缓存中找,没有则到磁盘文件读取并拷贝到页缓存,再从页缓存拷贝到用户空间的Kafka,最后通过socket连接和网卡发送给消费者,共经历四次数据拷贝

使用零拷贝 -> 两次数据拷贝
在这里插入图片描述

  • Kafka使用零拷贝后,消费者消费数据时,若页缓存中不存在消息,从磁盘读取数据到页缓存后,Kafka委托系统直接从页缓存拷贝数据到网卡,数据拷贝次数减少为两次,性能提高。
  1. 消息压缩
    • Kafka内部提供多种数据压缩算法,发送数据时可设置,压缩后可减少磁盘IO(特别是网络IO),但压缩会耗费一定CPU,需根据实际情况设置。
  2. 分批发送
    • 将消息打包分批发送,多个消息组成一个批次,减少网络传输开销,提高网络传输效率和吞吐量。可通过参数配置控制批量发送消息的大小(默认16K),还设置了等待时间,若在等待时间内未达到16K,Kafka也会将缓冲区数据发送出去,避免消息积压。
  3. 面试回答建议
    • 回答面试官关于Kafka高性能设计问题时,至少要陈述消息分区、顺序读写、页缓存和零拷贝这四点内容。消息分区使存储不受单台服务器限制;顺序读写提升读写效率;页缓存将磁盘访问变为内存访问提高性能;零拷贝减少上下游切换和数据拷贝。还可提及消息压缩减少磁盘IO和网络IO,分批发送减少网络开销等内容,同时文稿里提供了参考回答供查阅。

Kafka中零拷贝的实现是其高性能设计的重要部分,通过减少数据拷贝次数来提升性能,具体实现过程如下:

1. 传统数据传输中的数据拷贝

在Linux系统中,存在用户空间和内核空间的划分,用户空间权限小,内核空间权限大且可调用系统资源。当Kafka服务在用户空间进行数据传输时,例如生产者发送消息到磁盘以及消费者消费消息的过程,涉及多次数据拷贝:

  • 生产者发送消息时,数据从用户空间拷贝到内核空间的页缓存,批量发送时再从页缓存写入磁盘,这是两次数据拷贝。
  • 消费者消费消息时,若页缓存中没有消息,需先从磁盘文件读取消息拷贝到页缓存,再从页缓存拷贝到用户空间的Kafka,最后通过socket连接和网卡发送给消费者,这里共发生四次数据拷贝。频繁的数据拷贝操作导致性能不高。

2. Kafka零拷贝的实现流程

在这里插入图片描述

为了提升性能,Kafka采用了零拷贝技术,其流程如下:

  • 消费者消费数据时,Kafka先判断页缓存中是否存在消息。若不存在,从磁盘文件读取数据并拷贝到页缓存,这一步与传统方式相同。
  • 关键在于,Kafka在得知消费者要消费消息后,不再将数据从页缓存拷贝到用户空间的Kafka,而是委托系统直接从页缓存把数据拷贝到网卡,从而直接将数据发送给消费者。

3. 零拷贝的优势

通过这种方式,Kafka实现了零拷贝,数据拷贝次数从传统方式的至少四次减少为两次(磁盘到页缓存、页缓存到网卡)。拷贝次数的减少极大地提高了数据传输效率,降低了CPU和内存的开销,从而提升了Kafka的整体性能,使其能够更高效地处理大规模数据的传输和存储。


http://www.kler.cn/a/461226.html

相关文章:

  • 【深度学习-降维篇】t-SNE:让高维数据“看得见”的降维利器
  • 网安数学基础期末复习
  • xdoj校验和
  • Nginx - 整合lua 实现对POST请求的参数拦截校验(不使用Openresty)
  • vue v-for 数据增加页面不刷新
  • 前端路由layout布局处理以及菜单交互(三)
  • 手写顺序流程图组件
  • Windows onnxruntime编译openvino
  • 部分开源数据整理
  • win32汇编环境下,对话框程序中生成listview列表控件,点击标题栏自动排序的示例
  • STM32 高级 物联网通讯之LoRa通讯
  • SNIPE-IT详细安装教程(已安装成功)
  • RabbitMQ - 2 ( 21000 字 RabbitMQ 入门级教程 )
  • Android学习小记3
  • 耳切法简述
  • 矩阵的因子分解3-LU分解和LDU分解
  • WebSocket 入门详解
  • 【每日学点鸿蒙知识】Taro、native层获取文件宽度、位置变化callback、数据迁移、oh_modules说明等
  • QT--多线程
  • 深入浅出 Spring (二)| 依赖注入(DI)、自动装配
  • 课程思政元素收集系统|Java|SSM|JSP|
  • 计算机网络基础知识(7)中科大郑铨老师笔记
  • 【视觉SLAM:四、相机与图像】
  • 公交智眼 4G 录像机:开启安全运营新篇章
  • spring中常见的自动注入方式
  • 论文实现:Reactive Nonholonomic Trajectory Generation via Parametric Optimal Control