00:01
大家好,欢迎大家继续收看上硅谷的Linux云计算视频,我是刘川老师。那我们呢,今天需要来讲一下我们web服务器当中的N几服务器,那N几服务器讲之前我先给大家说一下啊,我们前几节课呢,讲了关于我们的lamp环境。然后呢,又讲了我们的LNMMP环境。然后呢,又讲了我们的阿帕奇服务器。看大家不难看出来啊,我们把两个web平台讲完之后呢,我们把两个web平台当中的web服务器阿帕奇拿出来单独讲了。然后呢,我们今天就需要把LNNP当中的N,比如说NG和四单独拿出来讲一讲,OK。那在讲N之前啊,我们需要先来明确几个概念性的问题,OK,那我们这个地方有两个概念,一个是同步,一个是异步,然后再一个是阻塞和非阻塞,那这两个东西呢,涉及到我们N克色以及阿帕奇的运行原理,以及它们两个的一个区别,OK。
01:02
好,我们先来看一下关于同步和异步的概念是怎么回事。那同步的同步和异步呢,在这个重点上啊。突出的是消息通知的方式啊,消息通知的方式,那也就是说我们在执行某一程序时,调用到这个程序的结果的通知方式不一样啊。这个结果反馈的通知方式不一样,OK,那我们先看同步的定义。当一个同步的调用发出去之后,调用者需要一直等待调用的一个结果的反馈。如果有反馈,才执行后续的操作。才执行后续的操作。那再来看异步,异步是当一个异步的调用发出去之后,调用者不需要一直等待调用返回结果。然后呢,异步调用就可以在调用了这个对应的什么。调用了对应的程序之后,我来去干其他的事儿,然后当有结果返回之后,我再接收这个结果,而不需要一直等待,这就是同步和异步的一个区别,但是异步呢,其实是有两种不同的方式的,我们来看一下。
02:10
异步呢,一种是主动轮询异步啊,主动轮询异步,所谓的主动轮询异步,就是主动去问返回来了没啊,给补了没啊,就是反复的去问啊,反复的去问啊。第二种就是什么呢?被调回方通过call back方式,也就是说回调通知的方式来获取调调用的结果的方式,也就是说我等着如果消息返回了,告诉了我再去取这个返回值,OK,那这个。这个概念相对比较抽象一下,我呢给大家举了一个关于取快递的例子,OK。那我们先来说同步,同步取快递什么样的?就是小明收到一个快递。然后呢,这个快递告诉他马上要到了,比如说收到了这个快递即将送达的短信,那这个时候如果是同步的话,那小明就去楼下等着,并且一直等到那个快递送到他手上为止。
03:05
那假如说小明收到这个快递马上送达的消息之后,他去楼下等着,但是这个快递一直没来,那这个时候小明什么都不能干,就必须一直在楼下等着,那这个模式就是同步取快递的模式,也就是说同步调用的一个模式。那咱来看一步。所谓的异步取快递就是什么呢?异步处理的方式就是小明收到了这个快递即将到达的消息,小明去楼下取快递了。收到了消息之后,去到楼下取快递,也就是说他必须等到这个快递已经到楼下,确定这个消息已经到了,他才会去取,如果说告诉他快到了。但是还没有到,这个快到了是多长时间呢?不好说,在快到了还没到的时候,小明不会下去,小明只有等到这个快递已经到楼下,消息已经到了的时候才会去取,这种就叫异步。
04:00
看这就一步,而不是说你告诉我怎么着,我就直接过去了。但是异步取有两种方式,我们来看一下。异步快,异步取快递两种方式,第一种叫什么呢?叫主动轮询异步调用,那什么模式呢?就是小明在接收到快递快到达的时候呢,不。停的去给那个快递小哥打电话,不停的问小哥到哪儿了?快到了没有,到了之后我去取一下,还没到,又过两分钟,小明打上了,小哥,你到哪了?到了没有啊?到了我去取一下。主动去询问消息到达位置,然后呢,直到问到消息到达了指定位置之后再去取,这就是主动允许模式,还有第二个模式。当收到了快递要送达的消息之后,小明给这个快递小哥打电话,小哥,你到我楼下之后再给我打啊,不到楼下别给我打,OK,然后这个时候小明就开始去干别的活了啊,小明开始去干别的活了,然后呢,开始等着小小这个快递小哥的电话,当快递小哥到楼下之后,开始给小明,小明你快递到了,快下来取吧,这个时候小明收到了消息的回调通知之后才会去取。
05:05
大家会发现同步取快递和异步取快递里边,同步取快递比较浪费时间,而且比较浪费资源,为什么如果你取的那个消息一直不给你的话,你需要一直占用着什么系统资源,这就是同步和异步的区别。OK,好了,同步和异步呢。通过这个例子就。理解差不多了吧,OK,那这个还是相对比较好理解的啊,OK,那我们再来看阻塞和非阻塞的概念,OK。那阻塞与非阻塞的重点不是在于什么?不是在于像我们同步异步这种消息通知方上,而是消息处理的方式上啊。尝试消息处理的方式,阻塞非阻塞在于进程和线程在等待消息的时候的行为,也就是说,如果你发起了一个行为,这个行为。需要别人来做,在别人做这个事儿的时候,你干什么?
06:00
你说这个小王你去帮我取个快递,然后这个时候小王去帮你取快递了,你是一直在这儿坐着不动,等小王把快递送到你手上来呢,还是在小王去帮你取快递的同时,你可以一边等着一边干别的事儿呢?这就是阻塞与非阻塞的一个区别。OK,那重点在于,在等待消息回来之前,你是一个挂起状态还是非挂起状态?OK,我们来看一下阻塞状态,所阻塞就是在发出这个调用请求之后。我们当前的进程被挂起,直到对应的请求返回来了,然后才进行什么线程的激活,然后继续处理这个返回来的值。那非阻塞,非阻塞指的是我想调用某一个内容,这个调用发出去了,但是呢,在调用发出去之后,我并不会停下来等待这个请求的回执,而是接着去干别的活。
07:00
当我调用的结果回来之后,我再激活其他的线程或当前线程,接着进行对返回来的值进行处理,那。还是我们通过取快递的例子来举啊,OK。来说一下阻塞区块力。那小明收到快递即将送达消息之后,什么事都不做,一直专心的等快递,这就叫阻塞行取快递。啊,这叫阻塞型区块里。那非注册型取快递什么意思呢?就是小明在收到了快递即将送达的通知之后,等着快递送。注意是等着快递送。到了我才去取,并且呢,在等待的过程当中,小明一边还在敲代码,一边在刷着微博,可能一边还在听着歌,诶,指不定干什么呢,比如说他等快递的这个过程当中,并不会耽误他干其他的活。并不会耽误他干其他的活,OK,那我们总结一下关于同步、异步、阻塞、非阻塞这个概念,OK。同步和异步在于消息的通知方式上。
08:01
在于消息的通知方式上,OK阻塞非阻塞在于消息等待的过程当中的等待行为上。注意,这是不同的概念啊,这是不同的概念,OK,那。这种不同的组合方式,就产生了以下的几种结果。第一种叫同步阻塞型。啊,数据处理方式,小明收到了这个即将到达的消息,什么都不干,就等着快递。这是阻塞同步阻塞型啊。然后呢,同步非阻塞性,小明收到了消息之后,一边刷微博一边等快递。啊,一边刷微博一边等快递,从哪儿啊?去拿快递的那个地方,去楼下,因为是同步状态嘛,只要去等快递就去楼下等。如果是同步阻塞型,就是去楼下站着,啥也不干,就等快递。如果是同步非阻塞,就是去楼下站着,一边刷微博,一边取快递,一边等快递。
09:01
再来看异不阻塞啊,再来看异不阻塞,所谓的异不阻塞就是什么呢?异不阻塞就是小明收到短信之后。在楼上等着,也不去楼下等,在楼上等着,但是在楼上等着呢,是啥也不干,就一直等着。异步非注册异步非注册指的是小明收到短信之后,还是在楼上,也不去楼下,等在楼上。然后呢,并且他等快递员的过程当中,他一边在等。快递员给他送达的消息,一边在干别的事儿,比如说一边刷微博啊,一边听歌,一边看小电影,OK都可以。那生态环境中我们常用的两种方式就是同步阻塞性和异步非阻塞性两个。就是相对比较极端的模式啊,两个相对比较极端的模式,OK,那这就是我们数据处理的模式啊,数据处理的模式OK,那我简单给大家说一下,我们的阿帕奇默认所使用的数据处理模式就是同步阻塞型。而N极克四,接下来我们要讲的N极克斯默认所使用的叫异步非阻塞型啊。
10:07
异步非组合OK,我们接着来看下面的内容。那生产环境中我们的很多服务啊,也就是说大部分的程序啊,他们的这种RO模型,也就是说input和output数据处理模型,大多数都是同步阻塞性。然后呢,单个进程每次只在一个文件描述符上执行程序。单个进程只在一个文件面和符上执行二个进程。每次这个R进程都会什么阻塞,直到数据传输完成,才会进行下一个任务的执行。所以说是阻塞,并且是同步。啊组三变形同步。一个server采用一个进程负责一个请求。一个。人接待一个工作,这个工作它处理完了,他才会去接待另一个工作,这就是这个模式啊,这就是这个模式。
11:01
OK,直到会话结束啊,直到会话结束,那进程数就是并发数,你有多少个进程,你就有多少个并发,OK,然后呢,操作系统支持的进程数是有限的,所以说进程数量越多,我们所需要消耗的系统资源也就越多。消耗的CPU资源,消耗的内存资源就会相对比较多一些,那这个时候你会发现我们这种同步阻塞型是无法支持高并发的,那。无法支持高并发,那这也是为什么我们阿帕奇无法支持高并发的原因,OK。看恩克斯呢,就正好采用了异步非阻塞型的方式,那在了解这个异恩克斯的异步非阻塞方式之前,我们先来这个谈另外一个概念叫什么呢?叫多路复用,叫RO的多路复用。这个RO的多路复用呢,目前我们采用的是Apple模型啊,这个Apple模型。我们来看一下。当连接有RO事件产生时,也就是说当有用户请求时。
12:04
我们的这个Apple就会去告诉进程,哪一个连接有这种请求过来啊,哪一个连接有请过来,并且呢,找一个什么工作进程去处理啊,找一个工作进程处理。比如说看这。意思就是这样的,小明楼下有一个什么,有一个消息收发室或者信件收发室,每次有快递来了,这个快递放到的是小明楼下的快递收发室。门卫呢,会对这个收到的快递做一个标记,并且通知小明去取快递。啊,并且通知小明去取快递,那就是什么呢?一个用户请求到达服务器上。这个时候呢,首先我们的Apple会把这个请求接收进来,然后。会把这个请求接收进来。然后呢,这个时候会直接有人处理吗?不一定啊,不一定,那如果有空闲的工作进程,那这个Apple就会调用一个工作进程来处理它。OK,那这个时候这个进程就有人,这个请区就有人处理了,那就类似于诶门卫收到了这个快递,门卫通知了小明,小明立马来取,那就立马处理,但是还有一种可能就是这个门卫上呀,接收的这个进程数量非常多,发现啊来取快递的呀,不一定在家,有一些人在家,有一些不在家,那些在家的时候能立法来取,那些不在家的时候没法来取,比如说处理不过来的情况。
13:25
当进程数量较多,处理不过来的时候怎么办呢?这个时候这个消息就存到了这个位置,然后直到有相应的进程来处理为止啊。想直到有相应的进程处理为止,OK,那这也就是我们的这个模型啊,这就是我们的一个模型,OK,这就是那个一号的模型。然后我们再来看一下关于NG为什么比如这个其他的一些外部服务器并发高,当然这个其他不是其指其他所有,而是指其他那些同步阻塞型的服务器为什么比他们并发高,也就说这个地方设计的就是我们NG克斯的一个工作原理了。
14:00
那N是默会启用这个叫USE1APPLE这个呃,工作模式,然后呢,以异步非阻塞的方式来进行一个工作,处理过程是每当有一个request请求进来之后,就会有一个相应的worker进程去处理,但是这个worker进程并不是全程处理。比如说。换一下。一个用户请求说,我要请求一个叫ABC的文件,这个时候去调用这个叫ABC的文件,那这个时候。在我们处理这个请求的时候,比如说他说他要ABC文件,我去帮他取的过程中,这个取的过程中是不是需要花时间啊。啊,需要花时间,那这个时候我再去调用这个ABC文件的时候。这个时候我这个工作进程不是一直等待着ABC这个什么结果回来,然后直再给用户,就是说我并不是一直在这等着ABC这个文件调用成功,并且给用户回,而是这个时候我释放掉了请求ABC的这个进程。
15:05
然后呢,转而去再接受另外一个用户的需求,比如说。呃,一用户二用户二用户又说我要一个BCD的文件,那这个时候由于我释放掉了调用ABC的这个,呃。这个这个这个进程,我就可以再接收BCD的进程,BCD说我要要一个叫2.t的文件,那这个时候我们的这个进程再去请求一个2.t的一个进程。OK,那当2.t这个进程处理完了之后,正好ABC那个文件也处理完了,那ABC回来之后,我再接着把那个ABC文件再传给一用户。那再传给用户,那就是这样的一个过程。去这样的过程,也就是说我不再是专门为某一个进程进行处理,而是我再处理某一个进程的时候。如果这个进程。不是立刻能完成,我可以释放掉该进程,然后转而去处理其他的进程。这样呢,通过快速的处理,快速的释放,快速的接收,然后来完成一个更高的一个并发量啊,然后完成一个更高的并发。
16:03
来看一下。不是全程处理,该进程处理可能到发生阻塞的地方之后,会向服务器发起一个什么呢?转发一个request,比如说交给其他人。并等待返回请求,那么这个处理的worker进程不会一直傻等着,他会在发送完请求之后呢,注册一个事件啊,注册一个事件,然后呢,如果后台返回值了,哎,我再接着干,如果你没返回,我就去干别的事,或者去休息也行啊,去休息也行,那此时这个时候如果再有新的request进来,这个正在休息的进程他就可以来处理了。看,这就是我们的多路复用进程的多路复用模型啊,多路复用模型。OK。由于我们N使用的是这种呃,异步非阻塞型的多路复用模式,所以说它能够什么呀,能够快速的进行。进程的处理,快速的释放请求,然后以达到一个同样的配置下更大的并发量的一个目的啊。
17:08
这就是为什么恩斯的并发量要远高于阿帕奇的原因啊。好了,那讲到这儿呢,就是我们关于恩基克斯在。服务讲解之前的这么一个啊。概念的一些了解,OK,我们简单来这个总结一下,首先呢,我们这个讲了关于臀部和异部的一个区别和作用,再一个讲了一下阻塞和非阻塞的一个概念,然后呢,我又讲了一下关于我们的这个程序的运行模式,还有Apple模型的啊,这种多路复用模型的一个工作模式,再一个就是讲了NG克斯啊。的一个工作流程,然后工作原理,OK,那讲到这了,我们本节课就到这儿了,我们下节课再见。
我来说两句