专栏名称: 芋道源码
纯 Java 源码分享公众号,目前有「Dubbo」「SpringCloud」「Java 并发」「RocketMQ」「Sharding-JDBC」「MyCAT」「Elastic-Job」「SkyWalking」「Spring」等等
目录
相关文章推荐
芋道源码  ·  线程池 坑中之王 ! ·  15 小时前  
芋道源码  ·  代码越“整洁”,性能越“拉胯”? ·  昨天  
芋道源码  ·  舒服!老板连夜夸我Controller写得优雅 ·  3 天前  
芋道源码  ·  放弃Websocket,使用 SSE ... ·  3 天前  
51好读  ›  专栏  ›  芋道源码

字节一面:kafka为什么这么快?

芋道源码  · 公众号  · Java  · 2025-01-25 12:43

主要观点总结

文章介绍了关于社群交流、开源项目、Kafka性能优化等方面的内容,包括项目实战、面试技巧、源码解析等。

关键观点总结

关键观点1: 社群交流

文章提供了一个社群交流平台,包括一对一交流、面试小册、简历优化、求职解惑等内容。

关键观点2: 开源项目介绍

文章介绍了一个破10万+ Star的开源项目,包括前端管理后台、微信小程序,后端支持单体和微服务架构等功能,并提供了项目地址和视频教程。

关键观点3: Kafka性能优化

文章详细解释了Kafka为什么这么快的原因,包括批量处理思想、磁盘顺序读写、零拷贝技术、页缓存加速消息读写、分区与并行处理以及数据压缩等技术细节。

关键观点4: 项目实战与面试技巧

文章内容涵盖项目实战、面试招聘、源码解析、学习路线等方面,对提升技术能力有所帮助。

关键观点5: 知识星球介绍与加入方式

文章介绍了知识星球的内容,包括项目实战、面试技巧等,并提供了加入方式。


正文

👉 这是一个或许对你有用的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入芋道快速开发平台知识星球。下面是星球提供的部分资料: 

👉这是一个或许对你有用的开源项目

国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。

功能涵盖 RBAC 权限、SaaS 多租户、数据权限、商城、支付、工作流、大屏报表、微信公众号、ERPCRMAI 大模型等等功能:

  • Boot 多模块架构:https://gitee.com/zhijiantianya/ruoyi-vue-pro
  • Cloud 微服务架构:https://gitee.com/zhijiantianya/yudao-cloud
  • 视频教程:https://doc.iocoder.cn
【国内首批】支持 JDK 17/21 + SpringBoot 3.3、JDK 8/11 + Spring Boot 2.7 双版本 

来源:捡田螺的小男孩


前言

有位粉丝去字节面试。问了一道很经典的八股文:kafka为什么这么快

其实这不就送分题嘛,哈哈~~ 我梳理了田螺版的答案:

  • 批量处理思想
  • 磁盘顺序读写
  • 零拷贝技术
  • 页缓存加速消息读写
  • 分区与并行处理
  • 数据压缩

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 视频教程:https://doc.iocoder.cn/video/

1. 批量处理思想

之前写SQL优化技巧的时候,就提到批量更新SQL ~~

假如你需要搬一万块砖到楼顶,你有一个电梯,电梯一次可以放适量的砖(最多放500),你可以选择一次运送一块砖,也可以一次运送500,你觉得哪个时间消耗大 ?

kafka为什么这么快,就是使用了批量操作 思想。

Kafka支持批量发送和接收消息 。生产者可以将多个消息打包成一个批次发送 ,消费者也可以一次性获取多个消息进行处理 。这样可以减少网络开销和磁盘I/O次数,提高性能。

  • Kafka生产者send()方法看似单条发送,实则内部批量处理 。消息先缓存,待数量足够或某个时间间隔 ,Kafka客户端将其打包成批次,一并发送给Broker。。
  • Broker服务端Kafka不会将消息分批后逐条处理 ,因其效率低下。Kafka智能地以批为单位处理消息,整个Broker处理流程(写入、读取、复制),批消息均保持原状不被拆分
  • 消费者从Broker拉取一批消息 后,在客户端拆分这批消息,再逐条交给用户代码处理。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud
  • 视频教程:https://doc.iocoder.cn/video/

2. 磁盘顺序读写

Kafka大量使用磁盘进行数据存储,并采用顺序写入 的方式。顺序写入磁盘的速度远远高于随机写入,因为磁盘的物理结构决定了顺序写入可以减少磁头的寻道时间 ,从而提高写入速度。

kafka是如何使用顺序读写提升磁盘IO性能的?

每个分区接收到的Producer消息,均按顺序被写入对应的日志文件中,当文件写满后,则开启新文件进行后续写入。在消费环节,从全局指定位置(即特定日志文件的特定偏移处)起,消息被顺序读取。

3. 零拷贝技术

Kafka使用零拷贝技术将数据从磁盘直接发送到网络,避免了在内核空间和用户空间之间的多次数据拷贝。

传统的文件传输方式通常需要将数据从磁盘读取到内核缓冲区,然后再从内核缓冲区拷贝到用户空间,最后从用户空间拷贝到网络缓冲区发送出去。而零拷贝技术可以直接将数据从磁盘的文件描述符传递给网络接口,减少了数据拷贝的次数和开销。

传统的IO流程:

  • 用户应用进程调用read函数,向操作系统发起IO调用,上下文从用户态转为内核态(切换1)
  • DMA控制器把数据从磁盘中,读取到内核缓冲区。
  • CPU把内核缓冲区数据,拷贝到用户应用缓冲区,上下文从内核态转为用户态(切换2) ,read函数返回
  • 用户应用进程通过write函数,发起IO调用,上下文从用户态转为内核态(切换3)
  • CPU将用户缓冲区中的数据,拷贝到socket缓冲区
  • DMA控制器把数据从socket缓冲区,拷贝到网卡设备,上下文从内核态切换回用户态(切换4) ,write函数返回

sendfile+DMA scatter/gather 实现的零拷贝流程如下:

  • 用户进程发起sendfile系统调用,上下文(切换1)从用户态转向内核态
  • DMA控制器,把数据从硬盘中拷贝到内核缓冲区。
  • CPU把内核缓冲区中的文件描述符信息(包括内核缓冲区的内存地址和偏移量)发送到socket缓冲区
  • DMA控制器根据文件描述符信息,直接把数据从内核缓冲区拷贝到网卡
  • 上下文(切换2)从内核态切换回用户态,sendfile调用返回。

Kafka 在处理大规模数据传输和存储时,采用了几种高效的零拷贝技术,主要包括:

  • sendfile:用于减少文件读取和网络传输中的内存拷贝,提高消息传输效率。
  • DMA(硬件加速):在高性能硬件环境下,Kafka 可通过硬件支持的 DMA 技术来加速数据传输。

4. 页缓存加速消息读写

Kafka利用PageCache(操作系统内存中的磁盘文件缓存 )来加速消息的读写。

当应用程序读写文件时,实际上操作的是PageCache中的副本。写入时,数据先写入PageCache,再批量写到磁盘;读取时,若PageCache中有数据则直接读取,否则操作系统会从磁盘加载数据到PageCache。Kafka读写消息时充分利用这一特性,由于消息通常很快被消费,按LRU策略,PageCache命中率高。这既提高了读取速度,又为写入让出了磁盘IO资源,间接提升了写入性能。

5. 分区与并行处理

Kafka的主题(Topic )可以被分成多个分区(Partition ),每个分区可以分布在不同的服务器上。这样可以实现并行写入和读取,提高了吞吐量。

其实以前写接口优化的时候,就提到并行优化的方式,思想道理其实是一样的:

比如一个查询APP首页查询接口:查用户信息、查banner信息、查弹窗信息是串行的:

如果修改为并行,接口耗时将大大降低

6. 数据压缩

生产者在发送消息到Kafka集群之前,可以对消息进行压缩 。这种在生产者端进行压缩的方式能够减少发送到Kafka集群的数据量,从而降低网络传输的带宽消耗,并提高数据传输的效率。

压缩传输内容,传输报文变得更小,因此传输会更快啦。10M带宽,传输10k的报文,一般比传输1M的会快呀。

打个比喻,一匹千里马,它驮着100斤的货跑得快,还是驮着10斤的货物跑得快呢?

kafka生产者端压缩算法的类型主要有:Snappy、GZIP、LZ4或zstd


欢迎加入我的知识星球,全面提升技术能力。

👉 加入方式,长按”或“扫描”下方二维码噢

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。

文章有帮助的话,在看,转发吧。

谢谢支持哟 (*^__^*)