00:00
Nike高性能架构设计我们说Nike,它是一个高性能的网络应用框架,能够处理大并发。所以说我们首先呢,要从Nike的架构设计来给大家做一个原理性的解释,而且在我们做面试的时候。面试官他也会涉及到这方面的一些问题,比如他会问Nike的架构设计,他的线程模型是怎样一种方式,需要你做一个阐述。那么我们来先来说说,在这个之前呢,我们需要给大家把线程模型,就是现有。的线程模型做一个系统的说明,最后呢,我们推出Nike线程模型,它的优越性。好,我们来看一下,不同的线程模型对程序的性能会有很大的影响。为了搞清楚ni它的线程模型是什么样子的,我们需要把其他的线程模型也拿出来讲一下,然后看看ni它的线程模型是怎样一步一步演变过来的。
01:04
从而呢,能够说明它的线程模型。一个优越性。目前存在的线程模型呢,有这么一些,一个呢就是传统主摄的IO服务模型,这在前面我们已经说过了。还有一个呢,就是reactor,这个reactor呢,翻译过来你可以认为是反应器模式,就是说。你可以把它这个这个翻译有很多啊,后面我们还会说,你可以认为是reactor是反应器模式。那根据reactor数量,还有处理资源资源它的这个线程。数量的不一样呢,还有又分成三种典型的实现。哪三种呢?第一种是单reactor单线程。另外一个是单reactor多线程,还有一个是主从reactor多线程,那么他们各自有它的一个模型来支撑。
02:05
当然也有一个演变的过程了,后面呢,我们会用图解的方式给大家说一下,那把这个react模型说完以后呢,我们要告诉大家ninety这个线程模型,它其实是基于这个模型的,就是主从reactor多线程模型,并且对主从reactor多线程模型做了一定的改进。其中主从reactor性质模型有多个,Reactor就在这里面呢,它的reactor就会有多个,那当然我相信同学们听到现在呢,可能是一头雾水,为什么?因为大家没有知不太知道reactor模型到底是怎样一种模型。所以说下边呢,我们就来一步一步的给它推导过来,好吧,我们先来看一下传统阻塞IO服务模型,它是怎样一个图示,其实前面我们已经说过了,只是这里呢在系统的说一下,大家看这边这张图。
03:01
这边这张图呢,它就说明了传统阻塞IO服模型的。原理。我们可以看到,呃,这边呢,有很多不同的颜色的框框,我们来说一下,有黄色的框,还有蓝色的框,还有白色的框,分别代表什么,我先说聊两句哈,我们再说一下黄色的框呢,就是同学们看到黄色的。黄色这个框,它表示的是对象,哎,它它表示一个对象,我把这个颜色稍微的处理一下。大家区分一下好吧,黄色的框呢,代表的是对象,我们把这个字体放小一点。黄色的框代表对象。同学们看到。蓝色的框代表的是线程。蓝色的框表示一个线程。同学们看到这里面还有绿白色的,这个白色的呢,也可以理解成是方法,也就是我们说的API。
04:05
白色的框表示什么呢?方法也就是我们所说的API,因为后面呢,我们有很多这样的图,所以说我先把它每一种,呃,不同的这这个图形表示什么含义说一下。那我们来看。传统阻塞IO服务模型它的特点是怎样的呢?我们看第一,我梳理一下它的点,它采用的是这样一种模型,采用。我梳理哈,采用什么呢,主色。它采用阻塞式IO。阻塞IO吧,我们叫主色IO。模型干什么呢?它获取获取输入的数据。诶,就是说你看一个client发过来了,发过来过后呢,我们这边其实是以阻塞的方式来获取客户端发送的数据,这是第一个特点,第二点呢,每个连接同学们看每个连接,每个连接都需要独立的。
05:08
他需要独立的什么呀,线程完成什么呀,完成数据的,注意听数据的输入。数据的输入,我把这边稍微往后面挪一下好吧。因为这个图呢,呃,也挺简单的,我们把这个图梳理一下,就是他完成数据的输入,业务处理。业务。处理。对,还要完成什么呢,数据的返回。数据返回。也就是换言之,我们每一个线程会对应一个客户端,它这边首先会。读取数据。读取完数据以后呢,但是读取的时候,它这边会有个handler,这个handler是一个逻辑的handler。就是一般来讲呢,我们这边会写一个类,这个类呢,它其实是充当了一个处理器的角色,然后他会去读取数据,然后进行我们相应的业务处理,比如说你要读取,要操作数据库啊,或者进行相关的业务处理啊等等,他在这处理,处理完了过后呢,再把处理后的这个结果返回给我们客户端,所以说白色的呢,就代表是方法或者是API。
06:22
那基于这样一个模型,它的问题有哪些呢?我们看一下,它的问题是当并发数并发数很大时。大家想一想,我们的并发数很大。你是不是就会需要创建大量的线程,这个蓝色的框就会越来越多,就会干什么呢?诶就会创建大量的。大量的县城。是不是那这样这样子线程过多,是不是就会对我们系统资源占用较大,就会占用。诶,占用较大的,占用很大的很大的系统资源。
07:02
因为我们每个线程呢,都会占用系统资源,所以说你想我们这个并发数越来越大,你服务器这段的压力就会越来越来越大。因为。我们。服务器处理大并发的时候,压力主要还是在server这一段。你的线程越来越多,显然维护起来就会越来越吃力,系统耗费呢也会非常的巨大。这是它的第一个问题,第二个问题还很麻烦,因为我们传统的这种服务模型,IO模型呢,它是一种阻塞形式的,因此还存在一个问题是连接。连接创建后,连接创建后如果什么呢?果当前线程就是当前这个线程暂时。就是暂时。暂时没有。没有什么呀,没有数据处理或者是可读,没有数据可读。它会干什么呢?该线程会阻塞在read的这个操作上,Red,它会阻塞在这个位置,就是该线程。该线程。
08:09
会。主色。阻塞在RAID。操作上。操作从而干什么呢?你这样子的话,本身你已经创建很多线程,你没有数据可读的时候,你还这个线程还会阻塞,那显然就会造成我们县城资源的浪费,对不对,造成什么呢?诶。造成县城资源浪费。同学们想一想是不是这个道理,因此它不但是线程数量巨大,对我们系统要系统资源,呃要就是耗费比较大,同时你创建这个线程过后,你还不好好去使用,你一旦这个客户端没有数据发送过来,你还阻塞在read,这个方法显然对线程还有资源浪费。
09:01
而且你你这个CPU,假设这个CPU来回切换线程,还有一个资源的浪费了,因此传统阻塞IO服务模型,其实呢,它没有办法去处理大并发的这种应用场景,好同学们,那关于传统主塞IO服务模型它的特点,还有它的问题,我们就分析到这儿,那他有问题,下一个就会怎么样呢?就会产生新的一种。IO模型来对它进行一个改进。
我来说两句