架构初探 · "快男"kafka

1、kafka是什么?

kafka是什么?借用官网的一幅图,一段话,身为技术的舔狗,我们舔舔他的魅力。kafka,一个用来构建实时数据管道流应用程序。它具有水平伸缩性,容错性,飞快运行,并且已经运行在上千家公司的产品中。wow。so cool,用它。

首先,他是一个分布式流数据处理平台。从这个角度来说,一个流平台需要具备三个关键能力:

发布订阅消息流,消息队列,或者消息发布系统。

高容错,持久化存储消息流。

当消息流到达时,高速处理。

毫无疑问,kafka是具备这些能力的。正如官网所说,

kafka适合用来构建几个系统之间稳定可靠获取数据的实时数据流通。

kafka适合用来构建实时数据处理的应用。

以上内容来自官网,有英语35级的小白搬运。

2、kafka的使用场景?

企业的系统运转,总是会时时刻刻地产生数据,我们都是数据马车上的工程师,企业能走得有多远,要看马车,马车很多,作用各不相同,有些内有乾坤,存住海量数据,有些思维智能,分析海量数据,相互协作,为公司红尘滚滚,策马奔腾。

一家牛逼的公司,总是会出动许许多多的马车,不,是像始皇帝那样的战车,一剑指,万马冲。那么,大家跑着跑着,数据源源不断产生,总是会成为信息孤岛,数据得流通呀。怎么获取数据,分析数据呢?

一匹战马一天产生一个亿的数据,十匹,10亿,百匹,百亿。我们的kafka这时候就闪亮登场,数据源源不断地产生,源源不断地发送给kafka,kafka就是数据流里的那座跨海大桥,把一座座孤岛串联起来。拓展疆土的战马通过kafa流转数据,提供给智能战马分析数据,创造价值,指明方向。

3、kafka处理速度有多快?

数据那么多,能处理过来才怪,想想挑剔又可爱的架构师们,头发能日渐残花,还不是为了做个快男吗?系统必须要快,快,快,快到看不见。那么kafka能满足要求么?基于上文我们可以知道kafka是要持久化存储到磁盘的。

kafka每次写入数据都写入磁盘,那么很明显速度肯定无法保证。我们总是用吞吐量来描述性能有多快,一秒钟能处理多少数据是检验的一个标准。而kafka单机可以支持每秒几十万消息写入,这样的性能怪兽,舔他。

那么为什么kafka的性能为什么这么快呢?高吞吐的实现,必须要依赖于低延迟,而kafka是基于磁盘存储的,这明显会使得kafka不可能这么快,那么就要提到kafka的极其牛逼的架构设计。

1.kafka自己不管理缓存,每次写入磁盘,首先写入到操作系统的page cache。

  首先我们普及一下什么是操作系统的page cache。当我们的业务系统或者应用想要  读取磁盘文件的时候,操作系统会先分配一些内存,将数据先加载到这些内存  中,然后再由系统读取。当我们的系统要将数据写入到磁盘,也会由操作系统先分配内存,数据会先写入内存,再有操作系统写入磁盘。

而kafka就是基于这样的设计。所以说,其实每次kafka的写入并没有直接发生磁盘IO,写入的大部分数据都是停留在操作系统的page cache里面。

相应的,当需要读取数据的时候,page cache里面的数据缓存的愈多,读取的速度也会相应提升。这里说明一下,优秀的框架都会相似之处,ES也采用了类似的设计。

2.磁盘的写入是顺序写入,而不是随机写入。

kafka写磁盘文件的时候是追加写入到文件末尾,磁盘顺序写入,这样子的性能是很高的,比磁盘随机写入高了好几个level。

3.利用sendfile机制,实现零拷贝技术,优化了Kafka进程和操作系统的上下文切换的次数,减少了数据拷贝的次数。

我们这里来思考一下,当我们业务系统要从kafka中读取数据的时候,是怎么个流程?

首先Kafka进程肯定先是从page cache中去读,没有读到就会从磁盘读取,当读到数据之后就会缓存到操作系统的一个page cache里面。

上下文切换到Kafka进程,将操作系统的page cache中的缓存数据拷贝到业务系统内存中,比如jvm内存中。

上下文切换到操作系统,将Kafka进程中的内存数据拷贝到socket cache中。

最终数据拷贝到网卡的buffer,通过网卡发送给消费端业务系统。

这其中我们可以看到有多次上下文切换和内存数据拷贝的过程,内核空间和用户空间频繁进行数据拷贝,这样子来说是很浪费性能的。

第2步和第3步要是能省略,将page cache里面的数据直接发送到网卡的buffer,这样子性能能提升好多。而这个就是零拷贝的一种实现,性能相当高。

可以看到kafka本质上就是希望通过数据读写都尽可能在操作系统的内存中完成,而不是频繁进行用户态和系统内核态之间的拷贝。这样子大大提升读写的性能。

你可能感兴趣的:(架构初探 · "快男"kafka)