00:01
Reactor模式,那同学们刚才我们是不是已经说过了,一种是传统IO主摄主摄模式,还有一种呢,就是react模式,React模式呢,下面呢,分了三种具体的实现,还记得吧,那么这三种具体的实我们在这已经说过了。这单reactor,单线程单reactor,多线程组成reactor,那现在呢,我们先不去讲它具体的三种实现,我们先对reactor模型它本身的机制做一个讲解。那么我们来看一下吧,同学们。来我们看一下前面我们说了传统阻塞IO模式它的问题,那针对这个问题,Reactor模式它的一个。理论它的一个原理是怎么去处理的呢?他这样子的针对传统阻塞IO服务模型的两个缺点,Reactor模式呢,做了相应的改进。第一个。
01:01
基于IO复用模型。也就是说它使用了基于IO复用模型,这点大家一定要理解。什么叫做IO复用模型呢?听下面的说解释,多个连接共用一个阻塞对象。这句话怎么理解?待会儿我画个图,应用程序只需要在一个阻塞对象等待,无需阻塞等待所有连接,当某个连接有新的数据可以处理时,操作系统通知应用程序线程从阻塞状态返回。并开始进行业务处理。这句话的意思其实就是要解决哪哪个问题呢?听我说,它主要是解决这个handler的问题。大家知道这个handler其实它本身是一个阻塞对象,为什么呀?因为当我们客户端没有数据啊发送过来的时候,那么read这个方法会被阻塞,因此这个handler呢,其实它就是个阻塞对象。那基于这样一个原因,我们。
02:05
Reactor呢,它提示它使用了IO复用模型,它是这么来处理的,我画一个简单的示意图,比如说我们这边呢,有很多的客户端。大家看我的简单示意哈。对,然后呢,我们再来看一个图,比如说这边是我们的服务器。这边是我们的服务器。我们换一个颜色哈,换一个这样的颜色,然后呢,它怎么做呢,大家看它在这里呢。服务器这边他提供了一个非阻塞的。就是他他应该是提供的还是一个阻塞阻塞对象,但是呢,他只需要一个主塞对象就可以了,我们把这个名字取一个叫做service handle。Okay。Service handler什么意思?我把我先把字体放小一点。
03:01
就说你将来这有很多客户端。有很多客户端,好,你的客户端呢,来吧,来找我。我这里呢,提供一个service handler。同样,我们再继续画。这是第二个好。第三个我们把请求发给服务器的server handler,这仍然是一个阻塞对象,但是呢,我们只提供一个阻塞对象,当我们发现你有连接的时候呢,我们就把这个连接干什么呢?建到后面去,就是连接一旦形成了以后呢,我们再去做一个所谓的。线程池。线程池,这个线程池里边呢,各位同学有很多的线程。但这个线程呢,我们可以认为是工作线程。换一个颜色。好,这是一个。两个三个好,比如我要画三个哈。我画三个。
04:01
那这个地方每一个是个县城,县城里面呢,我们也提供相应的handler。呃,但是这个这图画的可能因为太小了。小的大家可能看的有点不清晰,就说在每个我我就我把这个拉大一点吧,拉大一在每个这个线程里边呢,我们再去提供什么样一个handler。好,我们再换一个颜色哈。再换一个颜色,比如是个黑的,然后这边我就用一个H表示,这是一个handler,同样下面也是一样的,一样的道理哈,下面也是一样的道理,那下面呢,我这样复制一下就可以了。好,这样复制。一份。当然这里面这个线程池里面到底有多少个线程呢,可以根据你的。整个程序的规模来进行设计,大家看,当一个客户端有连接过来,先找到我们service handler,我这里是一个主材对象,但是只提供一个一个而不是多个了。
05:05
一旦连接形成,各位同学连接形成,那么我就会把这一个。具体的业务处理交给什么呀?交给一个线程,换个颜色。红色啊,换成这个颜色吧,同样道理,这也可以这样分发。打开。是不是?同学们看这是不是非常像一个分发模式,或者叫分发者模式,你看它大致的意思,我我这里画的是个简图啊,就是你这有很多高端,先把这个连接请求找到我们这个service handler service handler呢,根据当前这个线程的一个空闲的状态。看哪一个线程为你服务进行一个分发,那分发到比如分发到这个线程,那么这个线程呢,就跟我们这个客户端进行一个相应的这个处理,你看我这写的很清楚。
06:02
他第一个要解决,就说我们这个reactor要解决第一个问题是。多个连接共用一个阻塞对象。你看原先是你有你有很多handle,是不是都都要阻塞啊。是不是只要没有数据读取,我都要阻塞?那现在呢?我只有一个阻塞对象,第二个基于线程池复用,不必再为每个连接创建线程了。将连接完成后的业务处理,看这句话,将连接完成后的业务处理分配给其中的一个线程进行处理,一个线程可以处理多个连接业务,什么意思呢?大家可以看到。比如说我这个C1。C是用的这个线程。对不对,那假如我们这边客户很多,客户客户端很多啊,客户端很多,比如说C2。这是C2。这是。C3这是C4,比如哈,比如我们这个C1C2C3,那么你C一来的时候,我让线程一服务,C2来的时候呢,我让线程二服务C3来了,我线程三进行服务,C4来的话呢,诶,那我就不必因为你这个,你这个线程处理完了过后,你这个线程肯定是要空闲的嘛,是不是你不可能说诶我一直使用的因为线程。
07:24
他不是说一直处于一个工作状态,那我有可能把这个C4呢,又分配到这个线程去,就说我让这个连接好了功能,让这个C4连接成功以后,让哪一个线程为C4服务呢?就是让线程一服务,那换言之就是我们连就是一个线程可以处理多个连接的业务。对,这样子呢,又解决了一个什么问题啊,又解决了,也解决了前面的这个问题,哪个问题呢,就是。就这。每个连接都需要独立的线程完成,输入的输入,业务处理和数据返回,现在我是不是就可以达到一个线程复用了?
08:05
是不是解决了我们第一个痛点?第二个痛点是不是采用阻塞IO模式,是你你这个handle的对象,一直反正就是我跟你关联的这这个连接,只要你没有数据的交互,我就阻塞在这个地方,那现在是不是我这里只有一个service handler进行一个阻塞就可以了。明白这个意思吗?啊,好的,再就是我们所说的react模式的一个基本原理。他这个这个图啊,同学们只是解释了react模式的一个基本的原理,但是落实到具体的实现,它有三种。那三种模式呢,又有微小的变化,然后在第三种主从模式里面又衍生出来了我们的Nike。这样一个模式。好的,那那同学们看到这个图,我再多说一句,React模式呢,它嗯,它也有,它它的这个叫法有这么几种叫法,我跟大家写到这里。
09:05
啊,我们翻译成这个reactor它的。它对应的中文名呢,有这么几个名称。它的翻译啊,对应的对应的这个叫法。它叫法呢有这么几种,第一种叫法呢,我们把它翻译成反应反应器模式。这是第一种,第二种呢。第二种呢,有有些有些书上呢,它是基于你是把一个连,就是把一个具体的业务分配到某一个工作线程的,所以说他也叫什么呢,叫分发者模式。分分。法子。这个啊。分发。分发者模式。这个分发这种模式呢,他用英文来说就是这样子,Dispart。Pie。还有一种叫法,有些地方还有一种叫法叫什么叫做通知者模式。
10:02
通知者模式。就是这个英文,Notify。这种模式,那为什么还有通知的模式?因为它这里面有一个通知的过程,就是当看到没有,当有连,当连接有新的数据可以处理时,操作系统会通知应用程序,线程从阻塞返回。所以说他整整个reactor呢,他仍然还是要基于这种事件的,因此他有些地方也把它翻译,翻译成通知的模式,都是指的reactor。明白这意思哈,一个叫反应器模式,分发这种模式,有些地方叫通知总模式,都OK,好,同学们,这是老师画的一个简图,那对于react模式,它一个比较完整的图呢,完整的就是设计,呃,或者是它的一个架构图呢,可以看这个,大家再来看一看。我们看一下,呃,黄色的呢,能代表一个对象对。而白色呢,仍然代表的是什么呀,代表的是你可以认为是一个方法。
11:02
那这边呢,蓝色的仍然是线程,我们再来看对这个图做一个小结,同学们从这一个地方看reactor一个整体的设计理念,我再说一遍啊,这个图只是反映了一个整整体的设计理念,具体到不同的实现,因为它有三种实现。对不对?具体的不同实现呢?这个图还会有微小的变化,我们先对它的整体的设计理念做一个说明,第一个我们看到write模式,它是它的含义是什么?我们再说一下reactor模式。它是指什么呢?是指通过通过一个或或多个。多个输入请求,但就说你有一个或多个什么呢输入。同时干什么呀,同时传递。传递给服务器处理。服务器啊,我们叫服务啊,我看叫服务处理器吧,叫服务处理器。
12:06
就是我有一个或多个输入同时传递给你这个服务处理器,这不是server service handle吗?这个翻译过来就是服务处理器同时传递给服务处理器的一种模式,而且呢,它是基于什么呢?它是基于事件的。没问题吧,基于事件驱动,说全了叫基于事件驱动。这是。翻译的这样一句话,紧接着我们再继续来看服务器,服务器端的程序会怎么样呢?多些服务器。服务器端。服务器端程序它会怎么样呢?它会,呃,我们看看服务器端程序处理,对它是处理。处理传入的,传入的多个。多个多路请求或叫多个请求都可以。
13:00
多个请求,然后并并干什么呢?并将他们。他们同步,哎,叫同步分派,看到没有分派到。干什么呢?分派到。分配到不同的,不同的或者相应的分配到。相应的线程处理,或者叫处理线程分配到相应的处理线程。看到没有,就是你来了功能,我把你如果有相应的请求,我把它分配到dispatch嘛,分配到相应的处理线程,所以说这种模式呢,因此因此我们从这里可以看到,因此什么呀,React模式,React模式也叫。也叫什么呢?刚才我们所说的叫做dispat模式。PA模式及分发的模式,那从我们这个图可以看到我们react模式到底它是怎么来实现模式,它使用了。使用什么呢?它使用了IOIO复用使用了,嗯,叫做IO复用。
14:10
IO复用。复用这个监听哦,IO复用监听事件。监听。监听事件就说我我这个IO复用在这里产生的,我不是原先我不是一个handle对应一个C兰,我是让一个handleer对应多个克兰德,所以它是一种复用的一种监听事件,那收到事件后呢?大家看收到事件后,收到事件后干什么呢?分发。分发进行,分发给某个。哦,某个线程。但是也有可能是一个进程啊,就是我们因为现在是站在react这个模式来看的,还没有具体啊,一般来说对于我们实际开发线程,但是也有可能是一个进程,这是干什么,这一点啊,这一点就是。
15:03
这点就是什么呀,就是我们网络网络服务高并发处理的高并。高并发处理的关键。好了,那同学们。同学们。那关于?我们这个reactor这样一个图形呢,我们就梳理到这里。也就是把我们前面一个简单的示意图呢,简单原理图,把它画成了这样一个相对详细的一个图,并且进行一个梳理,其实它的关键点是在哪里呢?关键点就是说你原先有多个handler会被阻塞,现在呢,我用一个service,用一个阻塞对象来。来做就可以了,第二个呢,我因为你你这个你你现在以前是有一个CTO会对应一个处理线程,现在呢,我让我让一个这做一个线程池,线程池,然后我把你的一个具体的请求,业务请求,我分配给某一个处理处理线程就可以了,而且这一个处理线程的线程呢,它是可以对应多个连接的,并不是说我这一个处理线程只处理一个钩端。
16:14
对,我可以处理多个客户端,明白我的意思吧,这点大家一定要清晰。好的,这就说完了,那说到这里呢,我们再看一下reactor模式中核心的组成部分,再来看一下。这个reactor到底在什么地方呢?我们看reactor是在一个单独的线程运行,负责监听和分发事件。同学们看,根据这个概念,我们这个这这对应这个图,哪一个相当于是一个reactor。是不是这个是个writer啊。Service handler相当于是不是一个reactor呀?A看到没有?他说reactor是在一个独单独的线程中运行,负责监听和分发事件,分发给适当的处理程序来对IO事件做出处理,就好像我们公司的电话。
17:04
电话接线员,他接听来自客户的电话,并将这个线路转移给适当的联系人,啊,所以说这个呢,就是一个writer。那我们再来看handle,就这一块怎么理解呢?这个handle它就变成event handler。大家有没有发现跟传统的。这handler它叫handler,现在这边就干成变成了event handler event handle是不是就是事件处理器啊?诶回头我们再来理解这句话,他是处理程序,执行IO事件要完成的实际事件,就是说他是真正干活的。类似于客户想与之交谈的公司的实际官员,或者实际的这个工作人员通过调度适当的处理程序来响应IO处理程序,执行非阻塞操作。对,就说你那边就就说我不主塞在这里啊,我把这个时间给你分发过去,我继续监听。
18:01
明白这意思吧,我把相对说,我把这个分发过去继续监听,就这么一个事情好的。那同学们,那这是reactor的,Reactor的就是一个核心的设计理念,那具体到。它的实经这个典型的实现呢,又分成了这么三种,一种呢叫单reactor单线程,一种叫单reactor多线程,一种叫主从reactor,那么我们的Nike它的模型其实就是从这个主从reactor多线程演变过来的。对不对,好,那现在呢,我们就花一点时间哈,把这三种具体的实现对应的原理,原理图我们进行一个分析说明,这样呢,你就会比较深刻的理解Nike它的模型到底是。怎么一回事情,这样你在看源代码的时候呢,就会看的比较清晰,因为你看后面我们看这个来真实的模型,它是这么复杂的一个模型,同学们看到这里。
19:02
啊,这个还不是最复杂的。啊,这个也不是啊。在哪儿呢?Reactor组成。我要看啊。在这儿。看。这才是我们的ni模型,就他一步一步演变成这个样子了,但是上来过后,我们直接把这个图拿过来给大家看,其实你是很难理解。他怎么就演变过来的,明白我的意思吧,所以老师呢,还是希望大家这块地方稍微耐点心,因为我们ni本身呢,他在编程的时候几句话。几句话就能完成,以前你用NIO编程要写很多代码,他几句话就做完了。那隐藏了很多细节,而这个细节呢,往往是要通过一个图解的方式给大家进行一个描述,否则的话呢,你学完Nike过后,你会发现别人问你一些稍微底层一点的东西,你立马就蒙圈了,后面这个呢,这个模型我们不但要讲,而且我们要写程序,要用代码来支撑,再用debug的方式来给他追一下他到底是怎么回事,这样你才能真正的理解。
20:14
好,同学们,那关于这一块我们所说的reactor。卡格力,我们刚才讲到的是这儿。我们关于reactor模式的基本的一个讲解呢,就到这里。
我来说两句