Kafka 为何如此之快?深度解析其背后的秘密

目录

前言

一、生产者

1. 异步发送

2. 多分区并行

3. 消息批量发送

4.支持消息压缩

二、存储端

1. 分区和副本

2. 页缓存

3. 磁盘顺序写入

4. 零拷贝技术

5. 稀疏索引

三、消费端

1. 消费者群组

2. 批量拉取

3. 高效的偏移量管理

4. 并行消费

总结


前言

        Kafka 作为一款分布式消息系统,需应对海量消息的处理工作。Kafka 的设计思路是将所有消息全部写入速度较低但容量巨大的硬盘,借此获取更强大的存储能力,同时使用硬盘这种方式并未造成过多的性能损耗。Kafka单个节点的极限可以处理能力接近每秒 2000万 条消息,是一个相当出色的实时消息流处理平台。本篇文章将带你了解Kafka 通过哪些方式实现这么高的吞吐量。

一、生产者

1. 异步发送

        在发送消息时,Kafka 支持异步发送。这意味着应用程序可以将消息放入发送缓冲区后立即返回,而无需等待消息被确认发送成功。这种方式极大地提高了发送消息的效率,减少了应用程序的阻塞时间。例如,在一个高并发的电商系统中,用户的下单操作可以快速将订单信息异步发送到 Kafka,而不会影响用户的下单体验。

2. 多分区并行

        Kafka 中的分区(Partition)概念是实现高吞吐量的重要基石。生产者通过创建多个分区,将数据分散到不同的存储和处理单元。这就好比将一个大型任务分解为多个子任务,由多个团队并行处理。每个分区都可以独立地接收和存储消息,从而实现了并行写入,大大提升了整体的写入速度。 例如,假设有一个电商平台,每秒产生大量的订单消息。通过将订单消息按照不同的地区或商品类别分配到不同的分区,可以让不同的服务器同时处理这些分区的消息,而不是让单个服务器处理所有的订单,从而显著提高了处理速度。

3. 消息批量发送

        Kafka生产者在消息发送之前,会先把消息存储在 RecordBatch 中。当 RecordBatch 中的消息达到一定数量或者经过一定时间后,再统一进行发送。 这种批量处理的方式有效地减少了网络请求和系统调用的次数。想象一下,每次发送一条消息就像单独邮寄一个小包裹,而批量发送则像是将多个小包裹打包成一个大包裹一起邮寄。这样不仅减少了邮寄的次数,还降低了每次邮寄的准备工作和相关费用。 在实际应用中,比如一个监控系统每秒产生大量的性能指标数据,如果每条数据都单独发送,将会产生巨大的网络开销和系统资源消耗。而通过批量发送,能够显著降低这些成本,提高数据生产的效率。

4.支持消息压缩

        Kafka 支持在发送端进行数据压缩,启用消息压缩后,可以有效地提升数据传输效率,减少数据量,降低网络带宽的占用。 然而,压缩和解压过程会增加 CPU 的计算量。因此,在选择是否压缩以及采用何种压缩算法时,需要综合考虑数据的特点、网络带宽和 CPU 资源等因素。 例如,如果数据本身具有较高的重复性或可压缩性,如文本日志数据,使用压缩可以在不显著增加 CPU 负担的情况下,大幅减少网络传输的数据量。但对于已经高度压缩或计算密集型的数据,压缩可能带来的收益就相对较小,甚至可能因为增加的 CPU 计算量而影响整体性能。

        Kafka 默认情况下消息不进行压缩,生产者(Producer)在发送消息时,可以通过配置参数compression.type来指定消息的压缩类型。

二、存储端

1. 分区和副本

        通过分区,数据可以分布在不同的节点上进行存储和处理,实现了并行和负载均衡。副本机制则保证了数据的可靠性和可用性。比如,在一个分布式的金融交易系统中,交易数据通过分区存储,同时副本保证了数据不会因为节点故障而丢失。

2. 页缓存

        数据先存在 PageCache 中,定时 flush 到硬盘上。PageCache 是操作系统用于缓存磁盘数据的内存区域,其读写速度远高于磁盘。 当生产者写入数据时,首先将数据写入 PageCache。由于内存的高速读写特性,这一过程非常迅速。然后,Kafka 会定时将 PageCache 中的数据 flush 到硬盘上,确保数据的持久化存储。 这种方式充分利用了内存的优势,减少了直接对硬盘的频繁写入操作。在实际场景中,比如一个实时的金融交易系统,短时间内会产生大量的交易数据,通过将这些数据先缓存在 PageCache 中,可以快速响应生产者的写入请求,保证系统的低延迟和高吞吐量。

3. 磁盘顺序写入

        Kafka 采用顺序写磁盘的方式,这是其实现快速写入的原因之一。相比于随机写磁盘,顺序写磁盘的速度要快得多。 当写入数据时,Kafka 将消息依次追加到文件的末尾,就像在一个长长的卷轴上连续书写,而不是在不同的位置随机跳跃着书写。这种顺序写的方式避免了磁盘磁头的频繁寻道和旋转等待,大大提高了写入的效率。 以一个视频流媒体平台为例,大量的视频播放记录需要快速存储。采用 Kafka 的顺序写方式,可以高效地将这些记录连续写入磁盘,确保系统能够及时处理海量的用户行为数据。

4. 零拷贝技术

        消费者利用零拷贝技术从 socket 缓冲区中读取数据,避免了不必要的数据拷贝,极大地提高了数据读取的效率。

        传统的数据读取方式通常需要多次数据拷贝,从磁盘到内核缓冲区,再从内核缓冲区到用户空间缓冲区。而Kafka 利用了 Linux 的 sendFile 技术(NIO)零拷贝技术,省去了进程切换和一次数据拷贝。

5. 稀疏索引

        Kafka的索引并不是每一条消息都会建立索引,而是一种稀疏索引 也就是说,Kafka插入一批消息才会产生一条索引记录。后续利用二分查找,可以大大提高检索效率。 稀疏索引:kafka存储消息是通过分段的日志文件,每个分段都有自己的索引文件,这些索引文件中的条目不 是对分段中的每条消息都建立索引,而是每隔一定数量的消息建立一个索引点,这就构成了稀疏索引,稀疏索 引减少了索引大小,使得加载到内存中的索引更小,提高了查找特定消息的效率。例如,在一个大规模的日志存储系统中,稀疏索引可以帮助快速找到特定时间段的日志。

三、消费端

1. 消费者群组

Kafka 引入了消费者组(Consumer Group)的概念,多个消费者可以组成一个消费者组共同消费数据。通过消费者组的机制,可以实现负载均衡,提高数据消费的效率。 当组内的某个消费者出现故障时,其他消费者可以自动接管其未消费的分区,确保数据不会丢失和积压。这种自动的故障转移和负载均衡机制,使得 Kafka 在数据消费方面具有高度的可靠性和扩展性。 比如在一个分布式计算系统中,多个计算节点组成消费者组来消费任务分配消息,通过消费者组的协调工作,可以保证任务的均衡分配和高效处理。

2. 批量拉取

消费者不是逐个获取消息,而是批量拉取消息进行处理。这样减少了网络请求次数,提高了消费的性能。比如,在一个数据处理任务中,一次性拉取一批数据进行处理,而不是频繁地拉取单个数据。

3. 高效的偏移量管理

        Kafka 为消费者提供了偏移量(Offset)的概念,用于记录消费者消费的位置。通过高效的偏移量管理,消费者可以准确地从上次停止的位置继续消费,避免了重复消费或数据丢失。 偏移量的存储和管理方式也经过了精心设计,以确保其高效性和可靠性。例如,可以将偏移量存储在专门的主题中,或者使用外部存储系统来保证其持久性。 在一个实时数据分析系统中,准确的偏移量管理能够确保数据分析的连续性和完整性,提高数据处理的效率和准确性。

4. 并行消费

        消费者可以同时处理多个分区的消息,提高消费的效率。例如,在一个数据分析系统中,可以同时对多个数据源的消息进行分析处理。

总结

        综上所述,Kafka 在发送端、存储端和消费端的一系列优化策略,使得它能够在大数据处理场景中展现出惊人的速度和性能。无论是构建实时数据管道、流处理应用还是大规模的消息系统,Kafka 都是一个可靠且高效的选择。 希望通过这篇文章,能让您对 Kafka 为什么快有更深入的理解。

本文内容的思维导图如下:

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CS算法(二)—— 斜视SAR点目标仿真

SAR成像专栏目录 我们按照Cumming教授所著的《合成孔径雷达成像——算法与实现》7.6节的点目标参数进行仿真,斜视角设置为8,中心斜距改为1000km。先放最终的仿真结果: 1. 参数配置 在中心点和中心的的上下左右方向设置5个点目标 : function para=config_sar_para_cumming(…

【python数据处理】— “2020-01-01 05:20:15“日期格式数据

文章目录 一、数据说明及目标二、实现方式1.提取date2.提取hour3.提取weekday4.提取month 一、数据说明及目标 数据说明 数据表有一列名为"datetime"表示时间数据,该列的数据格式是"2020-01-01 05:20:15"。 import pandas as pd datapd.read_e…

[数据集][目标检测]刀具匕首持刀检测数据集VOC+YOLO格式8810张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):8810 标注数量(xml文件个数):8810 标注数量(txt文件个数):8810 标注…

堆结构、堆排序

堆 是完全二叉树,类似这种样式的 而这种有右子节点,没左子节点的就不是完全二叉树 分为大根堆和小根堆 大根堆是二叉树里每一颗子树的父节点都是这颗子树里最大的,即每一棵子树最大值是头节点的值 小根堆相反 把数组中从0开始的一段数人…

Spring Bean生命周期

Bean生命周期: 创建 Bean 的实例:Bean 容器首先会找到配置文件中的 Bean 定义,然后使用 Java 反射 API 来创建 Bean 的实例。 Bean 属性赋值/填充:为 Bean 设置相关属性和依赖,例如Autowired 等注解注入的对象、Value…

强强联合!当RAG遇到长上下文,滑铁卢大学发布LongRAG,效果领先GPT-4 Turbo 50%

过犹不及——《论语先进》 大学考试时,有些老师允许带备cheet sheet(忘纸条),上面记着关键公式和定义,帮助我们快速作答提高分数。传统的检索增强生成(RAG)方法也类似,试图找出精准的知识片段来辅助大语言模型(LLM)。 但这种方法其实有问题…

React@16.x(48)路由v5.x(13)源码(5)- 实现 Switch

目录 1&#xff0c;原生 Switch 的渲染内容2&#xff0c;实现 1&#xff0c;原生 Switch 的渲染内容 对如下代码来说&#xff1a; import { BrowserRouter as Router, Route, Switch } from "react-router-dom"; function News() {return <div className"p…

MySQL体系架构

1.1.MySQL的分支与变种 MySQL变种有好几个&#xff0c;主要有三个久经考验的主流变种&#xff1a;Percona Server&#xff0c;MariaDB和 Drizzle。它们都有活跃的用户社区和一些商业支持&#xff0c;均由独立的服务供应商支持。同时还有几个优秀的开源关系数据库&#xff0c;值…

JVM专题之Java对象内存模型

一个Java对象在内存中包括3个部分: 对象头、实例数据和对齐填充 数据 内存 -- CPU 寄存器 -127 补码 10000001 - 11111111 32位的处理器 一次能够去处理32个二进制位 4字节的数据 64位操作系统 8字节 2的64次方的寻址空间 指针压缩…

从零开始:大模型简介与应用|实战系列

实战系列 相信有不少伙伴对大模型有所耳闻&#xff0c;但也是一知半解&#xff0c;也许你知道很重要可以为自己的工作提供帮助但是不知道该如何结合&#xff0c;又或是转行的过程中并不知道从何入手&#xff0c;网上的教程要么不包含具体的操作步骤要么需要好几篇合在一起才能…

鸿蒙小案例-首选项工具类

一个简单的首选项工具类 主要提供方法 初始化 init()方法建议在EntryAbility-》onWindowStageCreate 方法中使用 没多少东西&#xff0c;放一下测试代码 import { PrefUtil } from ./PrefUtil; import { promptAction } from kit.ArkUI;Entry Component struct PrefIndex {St…

在window上搭建docker

1、打开Hyper-V安装 在地址栏输入控制面板&#xff0c;然后回车 勾选Hyper-V安装&#xff0c;如果没有找到Hyper-V&#xff0c;那么请走第2步 2、如果没有Hyper-V(可选&#xff09;第一步无法打开 家庭版本需要开启Hyper-V 创建一个文本文档&#xff0c;后缀名称为.bat.名称…

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【密钥生成介绍及算法规格】

密钥生成介绍及算法规格 当业务需要使用HUKS生成随机密钥&#xff0c;并由HUKS进行安全保存时&#xff0c;可以调用HUKS的接口生成密钥。 注意&#xff1a; 密钥别名中禁止包含个人数据等敏感信息。 开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harm…

【C++】 ——【模板初阶】——基础详解

目录 1. 泛型编程 1.1 泛型编程的概念 1.2 泛型编程的历史与发展 1.3 泛型编程的优势 1.4 泛型编程的挑战 2. 函数模板 2.1 函数模板概念 2.2 函数模板格式 2.3 函数模板的原理 2.4 函数模板的实例化 2.5 模板参数的匹配原则 2.6 函数模板的特化 2.7 函数模板的使…

html+css+js淘宝商品界面

点击商品&#xff0c;alert弹出商品ID 图片使用了占位符图片&#xff0c;加载可能会慢一点 你可以把它换成自己的图片&#x1f603;源代码在图片后面 效果图 源代码 <!DOCTYPE html> <html lang"zh"> <head> <meta charset"UTF-8"…

时空预测+特征分解!高性能!EMD-Transformer和Transformer多变量交通流量时空预测对比

时空预测特征分解&#xff01;高性能&#xff01;EMD-Transformer和Transformer多变量交通流量时空预测对比 目录 时空预测特征分解&#xff01;高性能&#xff01;EMD-Transformer和Transformer多变量交通流量时空预测对比效果一览基本介绍程序设计参考资料 效果一览 基本介绍…

番外篇 | YOLOv8改进之即插即用全维度动态卷积ODConv + 更换Neck网络为GFPN

前言:Hello大家好,我是小哥谈。本文所做出的改进是在YOLOv8中引入即插即用全维度动态卷积ODConv和更换Neck网络为GFPN,希望大家学习之后能够有所收获~!🌈 目录 🚀1.基础概念 🚀2.网络结构 🚀3.添加步骤 🚀4.改进方法 🍀🍀步骤1:block.py文件修改…

在TkinterGUI界面显示WIFI网络摄像头(ESP32s3)视频画面

本实验结合了之前写过的两篇文章Python调用摄像头&#xff0c;实时显示视频在Tkinter界面以及ESP32 S3搭载OV2640摄像头释放热点&#xff08;AP&#xff09;工作模式–Arduino程序&#xff0c;当然如果手头有其他可以获得网络摄像头的URL即用于访问摄像头视频流的网络地址&…

解析MySQL核心技术:视图的实用指南与实践案例

在数据库管理中&#xff0c;MySQL视图&#xff08;View&#xff09;是一种强大的功能&#xff0c;利用它可以简化复杂查询、提高数据安全性以及增强代码的可维护性。本篇文章将详细介绍MySQL视图的相关知识&#xff0c;包括视图的创建、修改、删除、使用场景以及常见的最佳实践…