主页 > 新闻资讯 > 大数据学习:Kafka为什么性能强劲?

大数据学习:Kafka为什么性能强劲?

作者:张老师 浏览次数: 2021-06-23 17:08
在大数据系统架构层面,消息中间件的运用是非常普遍的,而基于不同的场景,也有不同的消息中间件可以选择。比如说Kafka,作为近年来热度非常高的一个组件,性能强劲,受到主流青睐。今天的大数据学习分享,我们就主要来讲讲Kafka为什么性能强劲?

1、kafka的储存设计方面

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

大数据学习:Kafka为什么性能强劲?

2、异步发送高性能

Kafka的客户端发送数据到服务器,不是来一条就发一条,消息发送主要是两个线程:一个是Main用户主线程,一个是Sender线程。中间会经过内存缓冲区(默认是16KB),通过KafkaProducer发送出去的消息都是先进入到客户端本地的内存缓冲里,然后把很多消息收集到的Batch里面,再一次性发送到Broker上去的,这样性能才可能提高。

配置一:batch.size

每个分区未发送消息总字节大小,单位:字节,超过设置的值就会提交数据到服务端,默认值是16KB

配置二:linger.ms

默认值就是0,消息是立刻发送的,即便batch.size缓冲空间还没有满,如果想减少请求的数量,可以设置linger.ms大于0,即消息在缓冲区保留的时间,超过设置的值就会被提交到服务端;通俗解释是,本该早就发出去的消息被迫至少等待了linger.ms时间,相对于这时间内积累了更多消息,批量发送减少请求如果batch被填满或者linger.ms达到上限,满足其中一个就会被发送

3、零拷贝ZeroCopy(SendFile)

例子:将一个File读取并发送出去(Linux有两个上下文,内核态,用户态)

传统IO操作File文件的经历了4次copy

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

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

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

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

缺点:增加了上下文切换、浪费了2次无效拷贝(即步骤2和3)

ZeroCopy零拷贝只需要2次

1、请求kernel直接把disk的data读取到内存缓冲区2

2、socket缓冲区传输给网卡,而不是通过应用程序传输

结论:Zero copy大大提高了应用程序的性能,减少不必要的内核缓冲区跟用户缓冲区间的拷贝,从而减少CPU的开销和减少了kernel和user模式的上下文切换,达到性能的提升,对应零拷贝技术有mmap及sendfile。

大数据学习:Kafka为什么性能强劲?

4、利用Page cache+mmap

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

关于大数据学习,Kafka为什么性能强劲,以上就为大家做了简单的介绍了。在现有的消息中间件当中,Kafka的使用度还是很高的,尤其是实时消息流场景下,性能值得称赞。成都加米谷大数据,专业大数据培训机构,大数据开发、数据分析与挖掘,零基础班本月正在招生中,课程大纲及试学视频,可联系客服获取!
热点排行
推荐文章
立即申请>>