Kafka为什么这么快?

Kafka 是一个基于发布-订阅模式的消息系统,它可以在多个生产者和消费者之间传递大量的数据。Kafka 的一个显著特点是它的高吞吐率,即每秒可以处理百万级别的消息。那么 Kafka 是如何实现这样高得性能呢?本文将从七个方面来分析 Kafka 的速度优势。

  • 零拷贝技术

  • 仅可追加日志结构

  • 消息批处理

  • 消息批量压缩

  • 消费者优化

  • 未刷新的缓冲写入

  • GC 优化

以下是对本文中使用得一些英文单词得解释:

Broker:Kafka 集群中的一台或多台服务器统称 broker
Producer:消息生产者
Consumer:消息消费者
zero copy:零拷贝

1. 零拷贝技术

零拷贝技术是指在读写数据时,避免将数据在内核空间和用户空间之间进行拷贝,而是直接在内核空间进行数据传输。对于 Kafka 来说,它使用了零拷贝技术来加速磁盘文件的网络传输,以提高读取速度和降低 CPU 消耗。下图说明了数据如何在生产者和消费者之间传输,以及零拷贝原理。

Image from — https://blog.bytebytego.com/p/why-is-kafka-fast

Image from — https://blog.bytebytego.com/p/why-is-kafka-fast

步骤 1.1~1.3:生产者将数据写入磁盘
步骤 2:消费者不使用零拷贝方式读取数据

2.1:数据从磁盘加载到 OS 缓存

2.2:将数据从 OS 缓存复制到 Kafka 应用程序

2.3:Kafka 应用程序将数据复制到 socket 缓冲区

2.4:将数据从 socket 缓冲区复制到网卡

2.5:网卡将数据发送给消费者

步骤 3:消费者以零拷贝方式读取数据

3.1:数据从磁盘加载到 OS 缓存

3.2:OS 缓存通过 sendfile() 命令直接将数据复制到网卡

3.3:网卡将数据发送到消费者

可以看到,零拷贝技术避免了多余得两步操作,数据直接从OS 缓存复制到网卡再到消费者。这样做的好处是极大地提高了I/O效率,降低了CPU和内存的消耗。

推荐博主开源的 H5 商城项目waynboot-mall,这是一套全部开源的微商城项目,包含三个项目:运营后台、H5 商城前台和服务端接口。实现了商城所需的首页展示、商品分类、商品详情、商品 sku、分词搜索、购物车、结算下单、支付宝/微信支付、收单评论以及完善的后台管理等一系列功能。 技术上基于最新得 Springboot3.0、jdk17,整合了 MySql、Redis、RabbitMQ、ElasticSearch 等常用中间件。分模块设计、简洁易维护,欢迎大家点个 star、关注博主。

github 地址:https://github.com/wayn111/waynboot-mall

2. 仅可追加日志结构

Kafka 中存在大量的网络数据持久化到磁盘(生产者到代理)和磁盘文件通过网络发送(代理到消费者)的过程。这一过程的性能会直接影响 Kafka 的整体吞吐量。为了优化 Kafka 的数据存储和传输,Kafka 采用了一种仅可追加日志结构方式来持久化数据。仅可追加日志结构是指将数据以顺序追加(append-only)的方式写入到文件中,而不是进行随机写入或更新。这样做的好处是可以减少磁盘 I/O 的开销,提高写入速度。

人们普遍认为磁盘的读写速度很慢,但实际上存储介质(尤其是旋转介质)的性能很大程度上取决于访问模式。常见的 7,200 RPM SATA 磁盘上的随机 I / O 的性能要比顺序 I / O 慢 3 ~ 4 个数量级。此外,现代操作系统提供了预读和延迟写入技术,可以预先取出大块的数据,并将较小的逻辑写入组合成较大的物理写入。因此,即使在闪存和其他形式的固态非易失性介质中,随机 I/O 和顺序 I/O 的差异仍然很明显,尽管与旋转介质相比,这种差异性已经很小了。

3. 消息批处理

Kafka 的高吞吐率设计的核心要点之一是批处理,即 Kafka 在消息发送端和接收端都引入了一个缓冲区,将多条消息打包成一个批次(Batch),然后一次性发送或接收。这样做的好处是可以减少网络请求的次数,减少了网络压力,提高了传输效率。

Kafka 的消息批处理优化主要涉及以下几个方面:

发送端(Producer)

Kafka 的 Producer 只提供了单条发送的 send()方法,并没有提供任何批量发送的接口。当调用 send()方法发送一条消息之后,无论是同步还是异步发送,这条消息不会立即发送出去,而是先放入到一个双端队列中,然后 Kafka 使用一个异步线程从队列中成批发送消息。

Kafka 提供了以下几个参数来控制发送端的批处理策略:

  • batch.size:指定每个批次可以收集的消息数量的最大值。默认是 16KB。

  • buffer.memory:指定每个 Producer 可以使用的缓冲区内存的总量。默认是 32MB。

  • linger.ms:指定每个批次可以等待的时间的最大值。默认是 0ms。

  • compression.type:指定是否对每个批次进行压缩,以及使用哪种压缩算法。默认是 none。

接收端(Broker)

Kafka 的 Broker 在接收到 Producer 发送过来的批次后,不会把批次再还原成多条消息,而是直接将整个批次写入到磁盘中。这样做的好处是可以减少磁盘 I/O 的开销,提高写入速度。

Kafka 利用了操作系统提供的内存映射文件(memory mapped file)功能,将文件映射到内存中,使得对文件的读写操作就相当于对内存的读写操作。这样就避免了用户空间和内核空间之间的数据拷贝,也避免了系统调用的开销。

消费端(Consumer)

Kafka 的 Consumer 在从 Broker 拉取数据时,也是以批次为单位进行传递的。Consumer 从 Broker 拉到一批消息后,客户端把批次解开,再一条一条交给用户代码处理。

Kafka 提供了以下几个参数来控制消费端的批处理策略:

  • fetch.min.bytes:指定每次拉取请求至少要获取多少字节的数据。默认是 1B。

  • fetch.max.bytes:指定每次拉取请求最多能获取多少字节的数据。默认是 50MB。

  • fetch.max.wait.ms:指定每次拉取请求最多能等待多长时间。默认是 500ms。

  • max.partition.fetch.bytes:指定每个分区每次拉取请求最多能获取多少字节的数据。默认是 1MB。

4. 消息批量压缩

消息批量压缩通常与消息批处理一起使用。Kafka 会将多个消息打包成一个批次(Batch),并对批次进行压缩(例如使用 gzip 或 snappy 算法),然后再发送给消费者。这样做的好处是可以节省网络带宽,提高传输效率。

当然,压缩也有一定的代价,即需要消耗 CPU 资源来进行压缩和解压缩。但是对于 Kafka 这样的高吞吐量的系统来说,网络带宽往往是更大的瓶颈,所以压缩是值得的。

Kafka 还提供了一种灵活的压缩策略,即可以让生产者、代理和消费者之间协商压缩格式和级别。生产者可以选择是否对消息进行压缩,以及使用哪种压缩算法;代理可以选择是否保留生产者压缩的消息,或者对其进行重新压缩;消费者可以选择是否对收到的消息进行解压缩。这样可以根据不同的场景和需求来平衡性能和资源的消耗。

5. 消费者优化

Kafka 的消费者是基于拉模式(pull)的,即消费者主动向服务器请求数据,而不是服务器主动推送数据给消费者。这样做的好处是可以让消费者自己控制消费的速度和时机,也可以减轻服务器的负担,提高整体的吞吐量。

Kafka 的消费者所实现的功能是比较简洁的,即它们不需要维护太多的状态和资源,也不需要和服务器进行复杂的交互。Kafka 的消费者只需要做以下几件事:

  • 订阅一个或多个主题(topic),并加入一个消费者组(consumer group)。 向群组协调器(group coordinator)发送心跳,表明自己还活着,并参与分区再均衡(partition rebalance)。

  • 向分区所在的代理(broker)发送拉取请求(fetch request),获取消息数据。

  • 提交自己消费到的偏移量(offset),以便在出现故障时恢复消费位置。

可以看到,Kafka 的消费者并不需要保存消息数据,也不需要对消息进行确认或回复,也不需要处理重试或重复的问题。这些都由服务器端来负责。Kafka 的消费者只需要关注如何从服务器获取数据,并进行业务处理即可。

6. 未刷新的缓冲写入

Kafka 在写入数据时,使用了一种未刷新(flush)的缓冲写入技术,即它不会立即将数据写入硬盘,而是先写入内存缓存中,然后由操作系统在适当的时候刷新到硬盘上。这样做的好处是可以提高写入速度,减少磁盘 I/O 的开销。

Kafka 利用了操作系统提供的内存映射文件(memory mapped file)功能,将文件映射到内存中,使得对文件的读写操作就相当于对内存的读写操作。这样就避免了用户空间和内核空间之间的数据拷贝,也避免了系统调用的开销。

当生产者向 Kafka 发送消息时,Kafka 会将消息追加到内存映射文件中,并返回一个确认给生产者。此时消息并没有真正写入硬盘,而是由操作系统负责将内存中的数据刷新到硬盘上。操作系统会根据一些策略来决定何时刷新数据,例如定期刷新、缓存满了刷新、系统空闲时刷新等。

当然,这种技术也有一定的风险,即如果操作系统在刷新数据之前发生崩溃或断电,那么内存中未刷新的数据就会丢失。为了解决这个问题,Kafka 提供了一些参数来控制刷新策略,例如:

  • log.flush.interval.messages:指定多少条消息后强制刷新数据。

  • log.flush.interval.ms:指定多少毫秒后强制刷新数据。

  • producer.type:指定生产者是同步还是异步模式。同步模式下,生产者会等待服务器刷新数据后再返回确认;异步模式下,生产者不会等待服务器刷新数据,而是立即返回确认。

7. GC 优化

Kafka 作为一个 Java 编写得高性能的分布式消息系统,它需要处理大量的数据读写和网络传输。这些操作都会涉及到 Java 虚拟机(JVM)的内存管理和垃圾回收(GC)机制。如果 GC 不合理或不及时,就会导致 Kafka 的性能下降,甚至出现内存溢出或频繁的停顿。为了帮助使用者优化 GC,Kakfa 有如下建议。

堆内存大小

堆内存是 JVM 用来存储对象实例的内存区域,它会受到 GC 的管理和回收。堆内存的大小会影响 Kafka 的性能和稳定性,如果堆内存太小,就会导致频繁的 GC,影响吞吐量和延迟;如果堆内存太大,就会导致 GC 时间过长,影响响应速度和可用性。

通常来说,Kafka 并不需要设置太大的堆内存,因为它主要依赖于操作系统的文件缓存(page cache)来缓存和读写数据,而不是将数据保存在堆内存中。因此 Kafka 建议将堆内存大小设置为 4GB 到 6GB 之间。

堆外内存大小

堆外内存是 JVM 用来存储非对象实例的内存区域,它不会受到 GC 的管理和回收。堆外内存主要用于网络 I/O 缓冲区、直接内存映射文件、压缩库等。

Kafka 在进行网络 I/O 时,会使用堆外内存作为缓冲区,以减少数据在用户空间和内核空间之间的拷贝。同时,Kafka 在进行数据压缩时,也会使用堆外内存作为临时空间,以减少 CPU 资源的消耗。

因此,堆外内存对于 Kafka 的性能也很重要,如果堆外内存不足,就会导致缓冲区分配失败或压缩失败,影响吞吐量和延迟。通常来说,Kafka 建议将堆外内存大小设置为 8GB 左右。

GC 算法和参数

GC 算法是 JVM 用来回收无用对象占用的堆内存空间的方法,它会影响 Kafka 的停顿时间和吞吐量。GC 算法有多种选择,例如串行 GC、并行 GC、CMS GC、G1 GC 等。

不同的 GC 算法有不同的优缺点和适用场景,例如串行 GC 适合小型应用和低延迟场景;并行 GC 适合大型应用和高吞吐量场景;CMS GC 适合大型应用和低停顿时间场景;G1 GC 适合大型应用和平衡停顿时间和吞吐量场景等。

通常来说,Kafka 建议使用 G1 GC 作为默认的 GC 算法,因为它可以在保证较高吞吐量的同时,控制停顿时间在 200ms 以内。同时,Kafka 还建议根据具体情况调整一些 GC 参数,例如:

  • -XX:MaxGCPauseMillis:指定最大停顿时间目标,默认是 200ms。

  • -XX:InitiatingHeapOccupancyPercent:指定触发并发标记周期的堆占用百分比,默认是 45%。

  • -XX:G1ReservePercent:指定为拷贝存活对象预留的空间百分比,默认是 10%。

  • -XX:G1HeapRegionSize:指定每个堆区域的大小,默认是 2MB。

本文参考

  • https://medium.com/swlh/why-kafka-is-so-fast-bde0d987cd03

  • https://blog.bytebytego.com/p/why-is-kafka-fast

  • https://blog.csdn.net/csdnnews/article/details/104471147

总结

最后感谢大家阅读,希望本文能对你有所帮助.

关注公众号【waynblog】每周分享技术干货、开源项目、实战经验、高效开发工具等,您的关注将是我的更新动力!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1618399.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

PCI控制器扫描PCI总线过程解析

1、PCI的三种地址空间介绍 地址空间描述命令说明I/O空间供给设备驱动程序使用I/O操作命令对设备对应的I/O地址空间进行访问,此类访问不可预取存储空间供给设备驱动程序使用memory操作命令对设备的Memory空间进行访问,其中Memory操作命令又可分为Prefech…

从PC传输文件到ipad

首先从PC上进入iTunes。剩下步骤如图所示。

【iPhone和iPad设备管理和文件传输工具】iMazing 2.9.9 for Mac

文章来源于:风云社区 iMazing 2.9.9 for Mac iMazing- 管理你的iPhone。获取可信赖的软件来传输和保存您的音乐,消息,文件和数据。安全备份任何iPhone,iPad或iPod touch。iMazing功能强大且用户友好,是Mac和PC的最佳…

ipad如何投屏到xbmc_询问操作技巧:在iPad上设置文件传输拖放区,XBMC,并使用控制台模拟器享受复古游戏...

ipad如何投屏到xbmc Once a week we round up some of the reader questions we’ve answered and share them with everyone; this week we’re taking a look at setting up file transfer drop zones, installing XBMC on the iPad, and setting up a console emulator. 每周…

iOS系统与Windows电脑如何做到无线传输文件?

iOS系统与Windows电脑传输文件,大多数人可能会选择使用微信或QQ的 “文件传输助手”,今天我教大家一种一分钟设置,便可永久传输的简单方法。快点赞收藏起来吧!! (此处用iPad 第8代 2020为例子)…

Nginx详解 第三部分:Nginx高级配置(附配置实例)

Part 3 一、网页的状态页二、Nginx第三方模块2.1 echo 模块 三、变量3.1 内置变量3.1.1 常用内置变量3.1.2 举个例子 3.2 自定义变量 四、自定义访问日志 (优化)4.1 自定义访问日志的格式4.2 自定义json 格式日志 五、Nginx压缩功能(重要)六、HTTPS 功能…

Java“牵手”天猫商品历史价格信息API接口数据,天猫API接口申请指南

天猫平台商品历史价格接口是开放平台提供的一种API接口,通过调用API接口,开发者可以获取天猫商品的标题、价格、库存、月销量、总销量、库存、详情描述、图片、最低价、当前价格、价格信息等详细信息 。 获取商品历史价格接口API是一种用于获取电商平台…

美国慌了,满世界找稀土替代却找不到,最终还是得求中国

中国先后对稀土、镓、锗等稀有金属材料的出口采取限制措施,美国一开始并不慌,毕竟全球还有美国自己、澳大利亚、蒙古等国家拥有稀土矿藏,因此美国以为可以迅速找到替代,然而如今却发现事情并不简单。 中国占有的稀土矿藏确实不算最…

家用计算机音效部件图示,唱吧新版自定义音效设置方法(附上最佳音效设置参数图)...

新版唱吧发布后,觉得唱吧设计的音效越来越专业 真的很爱这个版本 愿研发GG们继续研发更多更牛的音效!我们这些唱粉也跟着一起进步。 除了界面大改版之外,录音功能也有大的改进喔! 一眼望去,以前的音效又增加了若干固定…

Java的异常与错误

对比 Exception 和 Error,另外,运行时异常与一般异常有什么区别? Exception 和 Error 都是继承了 Throwable 类,在 Java 中只有 Throwable 类型的实例才可以被抛出(throw)或者捕获(catch&#x…

渗透测试工具ZAP入门教程(1)-安装和快速开始

介绍 ZAP Zed Attack Proxy(ZAP)是一个免费的开源渗透测试工具,在 软件安全项目 (SSP)。ZAP 专为测试 Web 应用程序而设计,既灵活又可扩展。 ZAP的核心是所谓的“中间人代理”。它位于测试人员的浏览器和…

叁腾科技更新招股书:营收、净利双降,创始人鲁永祥有股权被冻结

日前,上海叁腾科技有限公司(Sentage Holdings Inc.,下称“叁腾科技”)向美国证券交易委员会(SEC)递交了更新后的招股书。招股书显示,叁腾科技拟在纳斯达克上市。 根据招股书,叁腾科…

任意系统升Windows10(microsoft官网)

打开https://www.microsoft.com/zh-cn/software-download/windows10 点击“立即下载工具” 下载好后点击“保留” 单击“MediaCreationTool20H2.exe”

竞逐新能源汽车续航,背靠广汽的巨湾技研能否打好“技术牌”?

续航、安全性能包括充电速度一直都是新能源汽车行业发展掣肘。 2020年以来,国内外主力电动乘用车续航普遍突破600公里,消费者续航焦虑逐步化解,但随之而来的是,需求侧对充电便捷性的考量,能否像传统车加油一样实现快速…

GD32E230C8T6_OTA升级

GD32E230C8T6_OTA升级 运行环境简介程序的起始地址进行分区总体流程图Bootloader 程序Bootloader 编译设置APP 分区部分APP 编译设置重点步骤 运行环境 1.Windows10 2. Keil5(MDK5) Version 5.27.0.0 3. MCU GD32E230C8T6 简介 本例程主要分析在线升级(OTA)的实现过程, 主要…

个人配置电脑清单 (windows+黑苹果)

自配第一套,3A游戏入门套 AMD锐龙 R5 3500X盒装微星B450 迫击炮 Max主板套装 1218元 酷兽DDR4 8G 3200MHz内存条 2条 301元 耕升1660 super 6g 炫光 1487元 爱国者极光风扇 4个 110元 航嘉 金牌500W WD500K电源 265元 先马(SAMA)鲁班1 机箱 179元 …

耕升 GeForce RTX 4070 星极皓月 OC给玩家带来DLSS3+2K光追百帧游戏体验

在2023年4月12日晚上21:00,耕升 GeForce RTX 4070 系列全系显卡正式解禁。作为NVIDIA 核心AIC合作伙伴之一的耕升,也紧跟步伐推出全新耕升 GeForce RTX 4070 星极皓月 OC 和 耕升 GeForce RTX 4070 星极幻姬 OC。其建议零售价为人民币5199元。耕升 GeForce RTX 4070…

耕升 GeForce RTX 4060 Ti 系列,为玩家带来DLSS3+1080P光追游戏体验!

NVIDIA 于2023年5月18日,正式发布GeForce RTX 4060 Ti系列,作为核心AIC厂商的一员,耕升此次也为玩家带来了多款耕升 GeForce RTX 40系列全新家族成员。其中囊括耕升 GeForce RTX 4060 Ti 追风 EX3和耕升 GeForce RTX 4060 Ti 追风&#xff0c…

shell脚本耕升(一)

文章目录 文件描述符自定义文件描述符数组和关联数组定义关联数组 别名获取终端信息获取,设置日期与延时延时 调试脚本函数与参数递归函数导出函数 读取命令序列输出不按回车键的方式读取字符“n”字段分隔符与迭代器for循环命令使用cat 查看script,scri…

高精度地图定位在高速公路自动驾驶系统中的应用

近年来随着汽车保有量不断增加,随之而来的是: ( 1) 严重的交通拥堵,通行效率低下,用在通行上的时间不断增加; ( 2) 交通事故频发,交通事故导致的伤亡人数和费用不断增加,而且绝大多数事故是由人为因素导致的; ( 3) 大气…