吊打面试官系列:从架构开始阐述,Kafka为什么这么快?

本文涉及的产品
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 吊打面试官系列:从架构开始阐述,Kafka为什么这么快?

一文带你了解kafka为什么那么快?

1.首先来说一下我们为什么要使用消息系统

在没有使用消息系统之前,许多传统的系统业务对于消息的处理一般会采用串行方式或者并行方法;


例如,你去网站注册一个账号,下面是串行跟并行的处理方式。


串行方式:


用户注册例子:用户主责,将注册信息记录到数据库后,发送注册消息邮件,再发送注册短信验证,每个过程小号50毫秒,一共就需要150毫秒


image.pngimage.png消息系统:


消息系统负责将数据从一个应用程序传送到另一个应用程序,因此应用程序可以专注于数据,但是不必担心 如何共享它。分布式消息系统基于可靠的消息队列的概念。消息在客户端应用程序和消息传递系统之间的异步排队。


2.消息系统的分类:

点对点:


主要采用的队列的方式进行消息传递,如A->B ,A生产B消费,当B消费的队列中的数据,那么队列的数据就会被消费,也就是删除掉。


发布-订阅:


主要有三大组件:


主题:一个消息的分类,假如有一类的消息全部都是订单,一类全部都是关于用户的,一类全部都是关于订单的。那么就根据这些创建不同的主题存放不同的东西。


发布者:将消息通过主动推送的方式推送给消息系统


订阅者:可以采用拉,推的方式从消息系统中获取数据


3.kafka的应用场景以及架构

apache kafka是一个分布式发布-订阅消息系统和一个强大的消息队列,使用scala语言编写是一个分布式,分区的,多副本的,多订阅者的日志系统,可以用于搜索日志,监控日志,访问日志等。


kafka架构图:


image.pngProdecers:生产者,主要用于生产数据。之后保存到kafka集群。


Consumers:集群的消费者,从集群中对生产者生产的数据进行消费。


Connectors:允许构建和运行可重用的生产者或者消费者,能够把kafka主题连接到现有的应用程序或数据系统。例如:一个连 接到关系数据库的连接器可能会获取每个表的变化。


Stream processors:允许应用程序充当流处理器(stream processor),从一个或者多个主题获取输入流,并生产一个输出流到一个或 者多个主题,能够有效的变化输入流为输出流。


相关术语说明:


Broker:kafka集群中包含一个或者多个服务实例,这种服务实例被称为Broker


Topic:每条发布到kafka集群的消息都有一个类别,这个类别就叫做Topic


Partition:Partition是一个物理上的概念,每个Topic包含一个或者多个Partition (分区)


Producer:负责发布消息到kafka的Broker中。


Consumer:消息消费者,向kafka的broker中读取消息的客户端


Consumer Group:每一个Consumer属于一个特定的Consumer Group(可以为每个Consumer指定 groupName)


架构关系图:


image.png流程介绍:Zookeeper是一个分布式的,开放源码的,用户分布式的协调服务,生产者push数据到集群,消费者通过pull进行拉取,但不管是生产者还是消费者的动作都需要zookeeper的管理。他的作用就是,生产者push数据到kafka集群,就必须要找到kafka集群的节点在哪里,这些都是通过zookeeper去寻找的。消费者消费哪一条数据,也需要zookeeper的支持,从zookeeper获得offset,offset记录上一次消费的数据消费到哪里,这样就可以接着下一条数据进行消费。


kafka Partition offset

offset是一个long类型数字,它唯一标识了一条消息,消费者通过(offset,partition,topic)跟踪记录。


任何发布到此partition的消息都会被直接追加到log文件的尾部,每条消息在文件中的位置称为offset(偏移量)。 记录到上一次消费的位置,之后跟踪到下一次接着上一次消费的位置进行继续消费。保证了每次都从下一条开始消费,不会重复消费也不会丢失消费。


kafka为什么那么快主要从下面4个方面进行理解:


1.kafka的储存设计方面


在Kafka文件存储中,同一个topic下有多个不同partition,每个partition为一个目录,partiton命名规则为topic名称+有序序号,第一个partiton序号从0开始,序号最大值为partitions数量减1。每个partition(目录)被平均分配到多个大小相等segment(段)数据文件中。但每个段segment file消息数量不一定相等,通过多个小文件段,就容易定期清除或删除已经消费完文件,减少磁盘占用。每一个sgement又包含了index文件和log文件,可以快速定位数据,通过index元数据全部映射到memory,可以避免segment file的IO磁盘操作。


2.利用Page cache+mmap


page cache用于缓存文件的页数据,页是逻辑上的概念,因此page cache是与文件系统同级的;他的作用就是加速数据的IO,写数据的时候首先写入缓存,将写入的页进行标记为dirty,之后向外部存储flush;读数据的时候就先读取缓存,没有读取到再去外部存储读取。page cache中的每个文件都是一棵基数树,树的每个节点都是一个页。根据文件内的偏移量就可以快速定位到所在的页。


为什么kafka要使用page cache 进行储存管理


1.JVM中一切都是对象,数据的对象储存会浪费空间


2.使用JVM管理,会降低吞吐量


3,如果系统程序崩溃管理的数据就会丢失,造成严重后果


mmap即是Memory Mapped Files 内存文件映射,可以把物理上的磁盘文件跟page cache进行映射,让进程可以读写内存,有助于数据读写与磁盘的交互


3.kafka的批量压缩设计


在大企业中,数据的流动时极快的,对于消息队列很多的情况加,系统要面临的问题就是不仅仅是磁盘的IO,更多的是网络的IO。所以消息的压缩对于kafka的性能来说就显得尤其重要。


Kafka 中,压缩可能发生在两个地方:生产者端和 Broker 端,kafka采用批量压缩的方式,而不是采用单个消息队列压缩。 如果对每一个消息都进行压缩,压缩的效率就会大大降低。kafka支持很多种压缩方式,允许使用递归的消息集合。


4.kafka的消息读写过程


1.Producer根据zookeeper连接到或者的broker,从zookeeper节点找到该partition的leader


2.producer把需要发送的消息发给该leader,leader把消息写入到log,follows从leader拉取消息,写入到本地的log之后向leader发送ACK,leader收到后向producer发送ACK


生产者把经过批量压缩的数据发送给broker之后,beocker就通过函数映射压缩文件的地址到内存,之后就可以根据这个函数进行写入的操作,写入的时候会直接进入到PageCache,之火由os的线程异步刷新到磁盘,达到一次性能优化。


kafka在读取数据的时候,会判断数据是否存在于page cache,如果存在的话就会直接从page cache中消费,所以消费实时数据的速度就会快很多。


5.ZeroCopy


在linux中有两个上下文,分别是内核态跟用户态,我们将一个File读取并发送出去需要经历4次Copy:


1.调用read,将文件拷贝到了kernel内核态


2.CPU控制 kernel态的数据copy到用户态


3.调用write时,user态下的内容会copy到内核态的socket的buffer中


4.最后将内核态socket buffer的数据copy到网卡设备中传送


缺点就是增加了上下文切换、浪费了2次无效拷贝


ZeroCopy技术:


请求kernel直接把disk的data传输给socket,而不是通过应用程序传输。Zero copy大大提高了应用程序的性能,减少不必要的内核缓冲区跟用户缓冲区间的拷贝,从而减少CPU的开销和减少了kernel和user模式的上下文切换,达到性能的提升


对应零贝技术有mmap及sendfile:


1.mmap:小文件传输快


2.sendfile:大文件传输比mmap快


应用:Kafka、Netty、RocketMQ等消息队列都采用了零拷贝技术


到这里kafka为什么这么快这个问题,相信你就可以跟面试官对答如流了!



目录
打赏
0
0
0
0
10
分享
相关文章
大厂面试高频:Kafka 工作原理 ( 详细图解 )
本文详细解析了 Kafka 的核心架构和实现原理,消息中间件是亿级互联网架构的基石,大厂面试高频,非常重要,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:Kafka 工作原理 ( 详细图解 )
招行面试:RocketMQ、Kafka、RabbitMQ,如何选型?
45岁资深架构师尼恩针对一线互联网企业面试题,特别是招商银行的高阶Java后端面试题,进行了系统化梳理。本文重点讲解如何根据应用场景选择合适的消息中间件(如RabbitMQ、RocketMQ和Kafka),并对比三者的性能、功能、可靠性和运维复杂度,帮助求职者在面试中充分展示技术实力,实现“offer直提”。此外,尼恩还提供了《尼恩Java面试宝典PDF》等资源,助力求职者提升架构、设计、开发水平,应对高并发、分布式系统的挑战。更多内容及技术圣经系列PDF,请关注【技术自由圈】获取。
关于 Kafka 高性能架构,这篇说得最全面,建议收藏!
Kafka 是一个高吞吐量、高性能的消息中间件,关于 Kafka 高性能背后的实现,是大厂面试高频问题。本篇全面详解 Kafka 高性能背后的实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
关于 Kafka 高性能架构,这篇说得最全面,建议收藏!
大厂面试高频:Kafka、RocketMQ、RabbitMQ 的优劣势比较
本文深入探讨了消息队列的核心概念、应用场景及Kafka、RocketMQ、RabbitMQ的优劣势比较,大厂面试高频,必知必会,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:Kafka、RocketMQ、RabbitMQ 的优劣势比较
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
512 37
【赵渝强老师】Kafka的体系架构
Kafka消息系统是一个分布式系统,包含生产者、消费者、Broker和ZooKeeper。生产者将消息发送到Broker,消费者从Broker中拉取消息并处理。主题按分区存储,每个分区有唯一的偏移量地址,确保消息顺序。Kafka支持负载均衡和容错。视频讲解和术语表进一步帮助理解。
美团面试: Kafka为啥能实现 10Wtps 到100Wtps ?kafka 如何实现零复制 Zero-copy?
40岁老架构师尼恩分享了Kafka如何实现高性能的秘诀,包括零拷贝技术和顺序写。Kafka采用mmap和sendfile两种零拷贝技术,前者用于读写索引文件,后者用于向消费者发送消息,减少数据在用户空间和内核空间间的拷贝次数,提高数据传输效率。此外,Kafka通过顺序写日志文件,避免了磁盘寻道和旋转延迟,进一步提升了写入性能。尼恩还提供了系列技术文章和PDF资料,帮助读者深入理解这些技术,提升面试竞争力。
美团面试: Kafka为啥能实现 10Wtps 到100Wtps ?kafka 如何实现零复制 Zero-copy?
大数据-52 Kafka 基础概念和基本架构 核心API介绍 应用场景等
大数据-52 Kafka 基础概念和基本架构 核心API介绍 应用场景等
92 5
大数据-53 Kafka 基本架构核心概念 Producer Consumer Broker Topic Partition Offset 基础概念了解
大数据-53 Kafka 基本架构核心概念 Producer Consumer Broker Topic Partition Offset 基础概念了解
100 4
面试题:Kafka如何保证高可用?有图有真相
面试题:Kafka如何保证高可用?有图有真相