kafka速度快的原因

快手面试题详解: Kafka为什么能那么快的6个原因 无论 kafka 作为 MQ 也好,作为存储层也罢,无非就是两个功能(好简单的样子),一是 Producer 生产的数据存到 broker,二是 Consumer 从 broker 读取数据。那 Kafka 的快也就体现在读写两个方面了,下面我们就聊聊 Kafka 快的原因。 1. 利用 Partition 实现并行处理 我们都知道 Kafka 是一个 Pub-Sub 的消息系统,无论是发布还是订阅,都要指定 Topic。 Topic 只是一个逻辑的概念。每个 Topic 都包含一个或多个 . 阅读详情

 

我们都知道Kafka非常快,比绝大多数的市场上其他消息中间件都要快。这里来研究下那么为什么Kafka那么快(当然不会是因为它用了Scala)。

Kafka的消息是保存或缓存在磁盘上的,一般认为在磁盘上读写数据是会降低性能的,因为寻址会比较消耗时间。

但是实际上,Kafka其中一个特性却是高吞吐率,即使是普通的服务器,Kafka也能轻松支持每秒百万级的写入请求,超过了大部分的消息中间件。这种特性使得Kafka在日志处理等海量数据场景中应用广泛。那么为什么Kafka速度那么快,可以从数据写入和数据读取两方面来分析。

Kafka的数据写入(生产者)

生产者(Producer)是负责向Kafka提交数据的,Kafka会把收到的消息都写入到磁盘中,因此可以认为它绝对不会丢失数据。

而为了优化写入速度,Kafka采用了两种技术,一种是顺序写入,一种是MMFile。

顺序写入

磁盘读写的快慢取决于你怎么使用它,一般可以分为顺序读写或者随机读写。

因为硬盘是机械结构,每次读写都会经过一个【寻址->写入】的过程,其中的寻址是一个十分耗时的机械动作,所以硬盘最讨厌随机I/O,最喜欢顺序I/O。为了提高读写硬盘的速度,Kafka就是使用的顺序I/O。而且Linux对于磁盘的读写优化也比较多,包括read-ahead、write-behind和磁盘缓存等。更多的,对Java的内存管理和垃圾回收会有优化,因为如果在内存做这些操作的时候,一个会导致Java对象的内存开销很大,另一个是随着堆内存数据的增多,Java的GC时间会变得很长。

因此可以总结出使用磁盘操作有以下几个好处:

1.磁盘顺序读写速度超过内存随机读写。

2.JVM的GC效率低,内存占用大,使用磁盘可以避免这一问题。

3.系统冷启动后,磁盘上的缓存依然可用(内存一旦关机数据就会清空,持久化到磁盘上则不会)。

kafka速度快的原因

 

上图就展示了Kafka是如何写入数据的,每一个Partition其实都是一个文件,收到消息后Kafka会把数据插入到文件的末尾(虚线框的部分)。

但是这种方法存在一个缺陷:没有办法删除数据。一次Kafka是不会删除数据的,它只会把所有的数据都保留下来,每个消费者(Consumer)对每个Topic都有一个offset用来表示读取到了第几条数据。

kafka速度快的原因

 

上图中有两个消费者,Consumer1有两个offset分别对应Partition0和Partition1(假设每一个Topic是一个Partition);Consumer2有一个offset对应Partition2.这个offset是由客户端SKD负责保存的,Kafka的Broker完全无视这个东西的存在;一般情况下SDK会把它保存到Zookeeper里面。(所以需要给Consumer提供Zookeeper的地址)。

如果数据完全不删除,那么肯定会导致硬盘爆满,所以Kafka提供了两种策略来删除数据,一是基于时间,二是基于Partition文件大小。具体配置可以参看它的配置文档。

MMFiles(Memory Mapped Files)

即便是顺序写入磁盘,磁盘的访问速度还是不可能追上内存的。所以Kafka的数据并不是实时的写入硬盘,它充分利用了现代操作系统的分页存储来利用内存,以此来提高I/O效率。Memory Mapped Files(后面简称MMAP)也被翻译成内存映射文件,在64位操作系统中一般可以表示20G的数据文件。它的工作原理是直接利用操作系统的Page来实现文件到物理内存的直接映射。完成映射之后,你对物理内存的操作会被同步到硬盘上(操作系统在适当的时候)。

通过MMAP,进程就可以像读写硬盘一样读写内存(当然是虚拟机内存),也不必关系内存的大小,因为有虚拟内存为我们兜底。使用这种方式可以获取很大的I/O提升,省去了用户空间到内核空间复制的开销(调用文件的read会有把数据先放到内核空间的内存中,然后再复制到用户空间的内存中)。但是这样也有一个很明显的缺陷:不可靠,因为写到MMAP中的数据并没有被真正地写入到硬盘中,操作系统会在程序主动调用flush命令的时候才会把数据真正地写入到硬盘中。Kafka提供了一个参数prducer.type来控制是不是主动flush,如果Kafka写入到MMAP之后就立即flush然后再返回Producer,就叫做同步(sync);如果Kafka写入到MMAP之后立即返回Producer不调用flush,就叫做异步(async)。

MMAP其实是Linux中的一个函数,就是用来实现内存映射的。Java的NIO提供了一个MappedByteBuffer类来实现内存映射(因此Kafka是沾了Java的光,而不是Scala)。

Kafka的数据读取(消费者)

为什么Kafka使用磁盘文件还能那么快——一个用硬盘的比用内存的还快,这绝对违反常识,因为Kafka作弊了,无论是顺序写入还是MMAP,其实都是Kafka作弊前的准备工作。

Zero Copy

Kafka使用了基于sendfile的Zero Copy提高Web Server静态文件的速度。

传统模式下,从硬盘读取一个文件是这样的:

1.调用read函数,文件数据被copy到内核的缓冲区(read是系统调用,放到了DMA,所以用内核空间)。

2.read函数返回,文件数据从内核缓冲区copy到用户缓冲区。

3.write函数调用,将文件数据从用户缓冲区copy到内核与Socket相关的缓冲区。

4.数据从Socket缓冲区copy到相关协议引擎(网卡)。

kafka速度快的原因

 

以上细节是传统的read/write方式进行网络传输的方式,我们可以看到,在这个过程当中,文件数据实际上是经过了四次copy操作:硬盘—>内核buf—>用户buf—>socket相关缓冲区—>协议引擎。而sendfile系统调用则是提供了一种减少以上多次copy,提升文件传输性能的方法。Kafka在内核版本2.1中,引用了sendfile系统调用,以此简化网络上和两个本地文件之间的数据传输。sendfile的引入不仅减少了数据复制,还减少了上下文的切换:sendfile(socket, file, len)。

运行流程如下:

1.sendfile系统调用,文件数据被copy至内核缓冲区。

2.再从内核缓冲区copy至内核中socket相关的缓冲区。

3.最后再socket相关的缓冲区copy到协议引擎。

相较传统read/write方式,2.1版本内核引进的sendfile已经减少了内核缓冲区到user缓冲区,再由user缓冲区到socket相关缓冲区的文件copy,而在内核版本2.4之后,文件描述符结果被改变,sendfile实现了更简单的方式,再次减少了一次copy操作。

在apache,nginx,lighttpd等web服务器当中,都有一项sendfile相关的配置,使用sendfile可以大幅提升文件传输性能。

Kafka把所有的消息都存放在一个一个的文件中,当消费者需要数据的时候Kafka直接把文件发送给消费者,配合MMAP作为文件读写方式,直接把它传给sendfile。

Java的NIO提供了FileChannle,它的transferTo()方法和transferFrom()方法就是Zero Copy。

Kafka的批量压缩

在很多情况下,系统的瓶颈不是CPU或磁盘,而是网络IO,对于需要在广域网上的数据中心之间发送消息的数据流水线尤其如此。进行数据压缩会消耗少量的CPU资源,不过对于kafka而言,网络IO更应该需要考虑。

1.如果每个消息都压缩,但是压缩率相对很低,所以Kafka使用了批量压缩,即将多个消息一起压缩而不是单个消息压缩。

2.Kafka允许使用递归的消息集合,批量的消息可以通过压缩的形式传输并且在日志中也可以保持压缩格式,直到被消费者解压缩。

3.Kafka支持多种压缩协议,包括Gzip和Snappy压缩协议。

Kafka速度快的秘密——作弊

Kafka把所有的消息都存放在一个一个的文件中,当消费者需要数据的时候Kafka直接把文件发送给消费者。这就是秘诀所在,比如:10W的消息组合在一起是10MB的数据量,然后Kafka用类似于发文件的方式直接扔出去了,如果消费者和生产者之间的网络非常好(只要网络稍微正常一点10MB根本不是事。。。家里上网都是100Mbps的带宽了),10MB可能只需要1s。所以答案是——10W的TPS,Kafka每秒钟处理了10W条消息。

可能你会说:不可能把整个文件发出去吧?里面还有一些不需要的消息呢?是的,Kafka作为一个【高级作弊分子】自然要把作弊做的有逼格。Zero Copy对应的是sendfile这个函数(以Linux为例),这个函数接受:

1.out_fd作为输出(一般及时socket的句柄)。

2.in_fd作为输入文件句柄。

3.off_t表示in_fd的偏移(从哪里开始读取)。

4.size_t表示读取多少个。

没错,Kafka是用MMAP作为文件读写方式的,它就是一个文件句柄,所以直接把它传给sendfile;偏移也好解决,用户会自己保持这个offset,每次请求都会发送这个offset。(还记得吗?放在zookeeper中的);数据量更容易解决了,如果消费者想要更快,就全部扔给消费者。如果这样做一般情况下消费者肯定直接就被 压死了 ;所以Kafka提供了的两种方式——Push,我全部扔给你了,你死了不管我的事情;Pull,好吧你告诉我你需要多少个,我给你多少个。

总结

Kafka速度的秘诀在于,它把所有的消息都变成一个批量的文件,并且进行合理的批量压缩,减少网络IO的损耗,通过MMAP提高I/O的速度。写入数据的时候,由于单个Partition(分区)是末尾添加的所以速度最优;读取数据的时候配合sendfile直接暴力输入。阿里的RocketMQ也是这种模式,只不过是用Java写的。

ITIL 4 Foundation 自学通关笔记1 ITIL 4 Foundation 自学通关笔记 阅读详情

相关推荐

Dify + mem0插件实战:如何让AI记住你的饮食习惯(附完整代码)

本文通过Dify平台与mem0插件实战,详细演示了如何为AI助手构建长期记忆系统,使其能记住并理解用户的复杂饮食习惯(如过敏源、饮食偏好)。文章提供了完整的工作流配置与Python代码示例,帮助开发者实现跨会话的个性化饮食建议,解决AI对话中的“健忘”问题。

lg888的博客 1096

Kafka面试小结五:kafka为何高效?为何速度很快?

是的,所有的问题,思路,优化点都已经列出来了,我们可以尽可能的细化,三个方向都可以细化,如此,所有的实现便一目了然,即使不看 Kafka 的实现,我们自己也可以想到一二点可以优化的地方。HashMap数据是无序的,是随机读写的。Producer、Broker 和 Consumer 使用相同的压缩算法,在 producer 向 Broker 写入数据,Consumer 向 Broker 读取数据时甚至可以不用解压缩,最终在 Consumer Poll 到消息时才解压,这样节省了大量的网络和磁盘开销。

之乎者也·的博客 970

android 数据库锁的问题

最近在项目中遇到一个错误: 12-26 17:29:10.501 32592 32644 W SQLiteConnectionPool: The connection pool for database '***.db' has been unable to grant a connection to thread 1378 (thread-pool-0) with flags 0x2 for...

低调的成长 2905

【Kafka】Kafka 为什么那么快的 6 个原因!

partition 并行处理顺序写磁盘,充分利用磁盘特性利用了现代操作系统分页存储 Page Cache 来利用内存提高 I/O 效率采用了零拷贝技术Producer 生产的数据持久化到 broker,采用 mmap 文件映射,实现顺序的快速写入Customer 从 broker 读取数据,采用 sendfile,将磁盘文件读到 OS 内核缓冲区后,转到 NIO buffer进行网络发送,减少 CPU 消耗。

plgy_Y的博客 2265

doris2.1.8连接报错ERROR 1203 (42000): Reach limit of connections解决办法

摘要:客户Doris数据库报错"ERROR 1203 (42000): Reach limit of connections"的解决过程。发现AI提供的解决方案存在错误:1)查询命令应为SHOW FRONTEND CONFIG而非show variables;2)参数名称应为qe_max_connection而非max_connections。正确解决步骤:1)用admin账户登录查看连接数限制和当前连接数;2)通过SHOW PROPERTY命令检查用户资源限制;3)针对不同情况修改参数

Brent的专栏 1762

用Matlab机器人工具箱搞定六轴机械臂建模:从DH参数到3D可视化(附完整代码)

本文详细介绍了如何使用Matlab机器人工具箱进行六轴机械臂建模,从DH参数输入到3D可视化全流程解析。通过正运动学验证、逆运动学求解和交互控制等实战技巧,帮助工程师快速掌握机械臂建模核心方法,并提供完整代码示例解决常见问题。

weixin_27372101的博客 396

Kafka快的原因

在过去的几年里,软件架构领域发生了巨大的变化。人们不再认为所有的系统都应该共享一个数据库。微服务、事件驱动架构和CQRS(命令查询的责任分离 Command Query Responsibility Segregation)是构建当代业务应用程序的主要工具。除此以外,物联网、移动设备和可穿戴设备的普及,进一步对系统的近实时能力提出了挑战。 首先让我们对“快”这个词达成共识,这个词是多方面的、复杂...

sinat 8794

算法 | A*算法实现最优路径规划

启发式探索是利用问题拥有的启发信息来引导搜索,达到减少探索范围、降低问题复杂度的目的。A*寻路算法是启发式探索的一个典型实践,在寻路搜索的过程中,给每个节点绑定了一个估计值(即启发式),在对节点的遍历过程中采取估计值优先原则,估计值更优的节点会被优先遍历。...

不断学习,不断进步,提高自己 6635

Kafka最佳实践-Kafka常见的使用误区

1.kafka集群单个节点磁盘挂载的越多越好 业界Kafka的标准使用方式是作为临时缓存使用。因此,很多人会误以为,kafka的每个节点只要存储够大就行,不用关心其他的指标。官方并不建议kafka单节点关在多个磁盘,因为磁盘越多,表示需要更多的处理线程去管理(num.io.thread决定),CPU的压力将非常大,如果磁盘数大于了CPU逻辑核数,kafka的CPU将因为非常繁忙导致数据落盘失败,从而影响业务。 建议: 建议每个节点挂盘数,满足每台机器最大挂盘数量 <= processor(CPU逻辑

HWCloudDeveloper的博客 1392

【AI 智能体】Windows 环境 Hermes Agent(爱马仕)安装详细过程

Windows 环境 Hermes Agent(爱马仕)安装详细过程

congge_study的博客 1833

蓝牙EDR模式中GFSK调制如何过渡到DPSK调制

这两份文档片段揭示了蓝牙Modem设计中非常精深的部分。它的核心思想是:通过精心的脉冲形状设计和重叠,来保证幅度连续;通过在保护间隔内执行一套复杂的“相位平滑算法”(重复、斜率保持、寻找基准点、冻结),来保证相位连续。Figure 3-2 则是将这个思想用图形化的方式展现出来,说明了脉冲在时间轴上的对齐和叠加关系。这种设计确保了发射机能够严格符合蓝牙规范的要求,实现不同调制方式之间的平滑、无毛刺切换,从而保障了通信的可靠性和高效的频谱利用率。

m0_49540263的博客 283

kafka读写速度快的原因

kafka的消息是保存或者缓存在磁盘上的,一般认为在磁盘上读写数据会降低性能,因为寻址比较消耗时间。但是实际上,kafka具有高吞吐性,轻松支持 每秒百万级的写入请求,在海量日志处理场景下广泛应用。 kafak读写速度快的原因: 一:生产者写入数据 kafka会把收到的消息都写入到硬盘中,它绝对不会丢失数据,为了优化写入速度kafka采用了两个技术:顺序写入和内存映射文件 1.顺序写入 磁盘读写有...

weixin_43255026的博客 2154

使用C# HslCommunication库实现三菱PLC通信(含完整代码示例)

在工业自动化开发中,上位机与PLC的通信是关键环节。HslCommunication库是一个开源的.NET工业通信库,支持三菱、西门子、欧姆龙等多个品牌PLC的通信协议。本文将演示如何通过库实现C#程序与三菱PLC的通信,并提供完整的代码示例。

StevenChen的博客 2294

Kafka速度快的原因

Kafka 之所以能实现惊人的高吞吐量(单机可达每秒处理百万级消息),并不是依赖某种“黑魔法”,而是因为它把计算机科学中已有的高效技术组合并发挥到了极致。简单来说,Kafka 的设计核心是:利用操作系统的特性,把磁盘写成内存的速度,把网卡跑满。Kafka 快的原因可以概括为:顺序 I/O 替代随机 I/O,零拷贝替代传统搬运,批量压缩减少传输量,并行分区利用集群算力。

qq_39239864的博客 521

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

两个服务器之间怎么传输大量数据速度快 java socket_kafka速度快的原因

我们都知道Kafka非常快,比绝大多数的市场上其他消息中间件都要快。这里来研究下那么为什么Kafka那么快(当然不会是因为它用了Scala)。Kafka的消息是保存或缓存在磁盘上的,一般认为在磁盘上读写数据是会降低性能的,因为寻址会比较消耗时间。但是实际上,Kafka其中一个特性却是高吞吐率,即使是普通的服务器,Kafka也能轻松支持每秒百万级的写入请求,超过了大部分的消息中间件。这种特性使得Ka...

weixin_39564853的博客 483

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

kafka速度快的原因分析

Apache Kafka基准测试:三台普通机器上每秒写入2百万消息。 kafka之所以速度快,这里主要从下面几方面进行分析。 1. 写数据 1.1 顺序写磁盘 在顺序磁盘IO,速度可以比内存随机IO更快。 Kafka官方给出的测试数据(Raid-5, 7200rpm) 顺序I/O: 600MB/s 随机I/O: 100KB/s 顺序读写磁盘优势 磁盘顺序读写速度超过内存随机读写 ...

L13763338360的博客 491

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

面试题: Kafka能够高效且写入速度快的原因

Kafka的高效性和快速写入能力源于其分区设计、顺序读写、批量优化、零拷贝技术、异步I/O、压缩技术、PageCache机制、稀疏索引、副本机制以及高并发支持。这些技术的结合使得Kafka在处理大规模实时数据流时表现出色,适用于日志收集、流处理等多种场景。

chbxw 1024

Kafka为什么速度快

https://www.cnblogs.com/binyue/p/10308754.html

weixin_38051945的博客 709

c++ mmap写入速度_kafka速度快的原因

我们都知道Kafka非常快,比绝大多数的市场上其他消息中间件都要快。这里来研究下那么为什么Kafka那么快(当然不会是因为它用了Scala)。Kafka的消息是保存或缓存在磁盘上的,一般认为在磁盘上读写数据是会降低性能的,因为寻址会比较消耗时间。但是实际上,Kafka其中一个特性却是高吞吐率,即使是普通的服务器,Kafka也能轻松支持每秒百万级的写入请求,超过了大部分的消息中间件。这种特性使得Ka...

weixin_32705525的博客 190

kafka为啥速度快

综上所述,Kafka 通过磁盘顺序读写、零拷贝技术、分区和多副本机制、批量处理以及高效的存储结构等多种技术手段,实现了高吞吐量和低延迟的数据传输,从而使其在处理大规模数据和高并发场景时具有出色的性能表现。三、分区和多副本机制。

weixin_39304656的博客 1189

Kafka速度快的原因-sendfile零拷贝介绍

。所谓的零拷贝是指将数据直接从磁盘文件复制到网卡设备中,而不需要经由应用程序之手。零拷贝大大提高了应用程序的性能,减少了内核和用户模式之间的上下文切换。对 Linux 操作系统而言,零拷贝技术依赖于底层的 sendfile() 方法实现。对应于 Java 语言,FileChannal.transferTo() 方法的底层实现就是 sendfile() 方法。 所谓零拷贝,就是减少上下文切换,不经由用户空间,直接在内核空间把数据发往网卡接口。 操作系统底层提供的sendfile(transferTo()函数

qq_30505673的博客 1457

为什么 Kafka 能这么快的 6 个原因

为什么 Kafka 能这么快的 6 个原因

qq_41490913的博客 143
上一篇: es 写入数据的工作原理是什么啊?es 查询数据的工作原理是什么啊?底层的 lucene 介绍一下呗?倒排索引了解吗?
下一篇: dirty_ratio与dirty_background_ratio参数区别--系统优化必选
王树民
博客等级 码龄10年 912粉丝 560原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值