你知道吗?
1、kafka是什么?
2、kafka的使用场景?
3、kafka处理速度有多快?
kafka,奥利奥,舔舔,扭扭,泡泡,真香。作为一个技术舔狗,怎么可能不去努力舔他呢?去深入浅出,去上下求索。
1、kafka是什么
kafka是什么?借用官网的一幅图,一段话,身为技术的舔狗,我们舔舔他的魅力。kafka,一个用来构建实时数据管道和流应用程序。它具有水平伸缩性,容错性,飞快运行,并且已经运行在上千家公司的产品中。wow。so cool,用它。
首先,他是一个分布式流数据处理平台。从这个角度来说,一个流平台需要具备三个关键能力:
毫无疑问,kafka是具备这些能力的。正如官网所说,
以上内容来自官网,有英语35级的小白搬运。
02
kafka的使用场景
企业的系统运转,总是会时时刻刻地产生数据,我们都是数据马车上的工程师,企业能走得有多远,要看马车,马车很多,作用各不相同,有些内有乾坤,存住海量数据,有些思维智能,分析海量数据,相互协作,为公司红尘滚滚,策马奔腾。
一家牛逼的公司,总是会出动许许多多的马车,不,是像始皇帝那样的战车,一剑指,万马冲。那么,大家跑着跑着,数据源源不断产生,总是会成为信息孤岛,数据得流通呀。怎么获取数据,分析数据呢?
一匹战马一天产生一个亿的数据,十匹,10亿,百匹,百亿。我们的kafka这时候就闪亮登场,数据源源不断地产生,源源不断地发送给kafka,kafka就是数据流里的那座跨海大桥,把一座座孤岛串联起来。拓展疆土的战马通过kafa流转数据,提供给智能战马分析数据,创造价值,指明方向。
03
kafka处理速度有多快
数据那么多,能处理过来才怪,想想挑剔又可爱的架构师们,头发能日渐残花,还不是为了做个快男吗?系统必须要快,快,快,快到看不见。那么kafka能满足要求么?基于上文我们可以知道kafka是要持久化存储到磁盘的。
kafka每次写入数据都写入磁盘,那么很明显速度肯定无法保证。我们总是用吞吐量来描述性能有多快,一秒钟能处理多少数据是检验的一个标准。而kafka单机可以支持每秒几十万消息写入,这样的性能怪兽,舔他。
那么为什么kafka的性能为什么这么快呢?高吞吐的实现,必须要依赖于低延迟,而kafka是基于磁盘存储的,这明显会使得kafka不可能这么快,那么就要提到kafka的极其牛逼的架构设计。
首先我们普及一下什么是操作系统的page cache。当我们的业务系统或者应用想要 读取磁盘文件的时候,操作系统会先分配一些内存,将数据先加载到这些内存 中,然后再由系统读取。当我们的系统要将数据写入到磁盘,也会由操作系统先分配内存,数据会先写入内存,再有操作系统写入磁盘。
而kafka就是基于这样的设计。所以说,其实每次kafka的写入并没有直接发生磁盘IO,写入的大部分数据都是停留在操作系统的page cache里面。
相应的,当需要读取数据的时候,page cache里面的数据缓存的愈多,读取的速度也会相应提升。这里说明一下,优秀的框架都会相似之处,ES也采用了类似的设计。
2. 磁盘的写入是顺序写入,而不是随机写入。
kafka写磁盘文件的时候是追加写入到文件末尾,磁盘顺序写入,这样子的性能是很高的,比磁盘随机写入高了好几个level。
3.利用sendfile机制,实现零拷贝技术,优化了Kafka进程和操作系统的上下文切换的次数,减少了数据拷贝的次数。
我们这里来思考一下,当我们业务系统要从kafka中读取数据的时候,是怎么个流程?
这其中我们可以看到有多次上下文切换和内存数据拷贝的过程,内核空间和用户空间频繁进行数据拷贝,这样子来说是很浪费性能的。
第2步和第3步要是能省略,将page cache里面的数据直接发送到网卡的buffer,这样子性能能提升好多。而这个就是零拷贝的一种实现,性能相当高。
可以看到kafka本质上就是希望通过数据读写都尽可能在操作系统的内存中完成,而不是频繁进行用户态和系统内核态之间的拷贝。这样子大大提升读写的性能。