00:02
主从reactor多线程。同学们先看一下这边这张图。这边这张图呢,就是展示了主从reactor多线程的基本原理,同学们看这张图呢,比原先是不是变得更加的复杂一些了?为什么呢?大家看,针对单reactor多线程模型中,我们这个reactor是在单线程中的运行,高并发下面容易出现瓶颈,可以让什么呢?可以让我们reactor在多线程中间运行,那有些同学老师我这没看出来呀,同学们看。我们这边它是这样分的,这有一个reactor主线程,这个主线程呢,就呃大家看这名字叫me reactor,它在这里呢,只去管连接的实验。OK,如果你客户端是请求连接,那么我可以进行处理。没问题,但是一旦涉及到真正的业务处理呢?它下面会有一个叫做react子线程来进行处理及sub reactor。
01:01
这个sub呢,也有自己的select,它也会进行分派,如果说他在这里当我再多说一句啊,一个子线程其实是可以监听多个的。那如果我发现有事情呢?我同样再去分配给不同的handle德尔处理。那这一节。这一节就跟前面是一样的了,就有点儿类似于什么感觉呢,有点类似于在我们前边的。单reactor多线程这个地方,他把这个reactor分了一个层,就分成了两层,一个组reactor,就相当于说这个组reactor呢,只管理这一块事。大家看,我给标一下你们就明白了。他就管这一块事,然后呢,再让一个reactor来管下面这个事啊,再让他的值reactor管这个事情。我讲到这儿,可能同学心里面有点疑惑了,说老师不对啊,那你这样写的话,不意味着这个react子线程也会出现这个瓶颈吗?
02:01
如果你这样想就对了,为什么?如果真的我们一个react主线程下面只对应一个reactor子线程,那这个确实没有什么意义,但实际上你要这么去理解,同学们,我跟大家说一下,你要理解成这一部分。OK,那么看到老师画的这一部分呢,它其实是可以有多个的。明白我的意思吧,就是说它其实是可以有多个的,并不是像我们想象的哦,只有这一个啊,你比如说我在这边。来了有一个,诶这个沙,我这次连接完了功能,我把任务分分配给了。这一个sub,那下一次呢,我可能分配给这一个subor。能理解我的意思吧,诶他是这样来理解的,那如果说呃,根据我的一个调度规则,我发现嗯,这两个sub都都是处于一个满运行的状态,我可以再把它分配,分配给下一个reactor,它是这样一种模型。
03:01
啊,这样子就OK了。所以说这样子呢,我们就可以有效的防止呃1REACTOR是在一个线程去运行,而可以干什么呢?呃,而可以把任务分解,我这个组react只管理呃,只去处理呃连接的呃连接请求,而把这些数据的或者叫IO的读取,业务的处理呢,IO的读取,我把IO的读取呢放到sub reactor。的handler,然后呢,再把业务的真正的处理再分配给我们的worker线程,所以它是相当于分了几层,大家看到其实相当于是分了三层,对不对,第一层。分配给sub sub再分配给WORKER3级模式。好的,嗯,同学们,那这个这个图这两根线我先去掉好不好,因为放在这太难看了,因此这一点大家要这么去理解,不能说诶只有一个,呃,Reactor主线程,只对应下面一个react主线程,那确实没什么意义。
04:01
实际上它是可以有多个,呃,那个纸上它呃可以有多个sub reactor,好,那么现在呢,我还是用文字的方式把这个主从reactor多线程呢进行一个梳理,大家理解一下。我们看第一句话。Reactor。主主主线程就是我们这个react主线程。干什么呢?主线程就是这个命。May。对象。他这个对象干什么呢?诶通过select。是不是他是有select吧,他通过select监控。或者监听都可以,监听什么呢?连连接试验。或者叫建立叫连接事件嘛,连接事件他监听的是连接事件收到事件后。收到事件后。
05:02
收到事件后。他干什么呢?他就去。通过我们这个accept,就是我们接收器处理连接事件啊,通过accept。处理连接事件。连接。连接事情就这样子,这就是说的这一集的事情,那么我们这个accepter它处理连接以后呢,干什么呢?当。这写当我们的这个accept。啊,它处理。处理连接后,连接事件后他要干什么事情呢?同学们,那么这个时候我们的me reactor,就是你们看大家看到这个me reactor。诶,这个怎么怎么回事,不变了,考虑文字啊。他就干什么呢,他就将。将这个连接,将我们这个创建好的连接分配,分配给什么呀,我们的sub reactor。
06:09
先把这些理论搞清楚啊,大家不要觉得好像这些理论呃很没有意思,其实我跟大家讲,你们要去自己看,还看起来很吃力的,这是老师梳理了一遍才会变得比较清晰,如果自己去看,其实挺麻烦的,我把这个梳理好,其实就是省了大家的事情了。他会把这个。我们的me reactor分配给我们的sub reactor,接着继续往下看下一集,那么这个时候subor干什么事情呢?我们说sub reactor。哎,它干什么呢?它将连接,将连接加入到连接队列。OK,连接队列。他基本是因为你可能有多个嘛,然后所以说我加入加入到一个连接队列进行监听。他也会有个监听动作,对吧,它是有有select,它监听什么呢?监听客户端是读写还是什么什么操作进行监听并创建。
07:07
同时他要创建,创建是诶,他要创建handler。干什么呢,进行。各种。各种呃处理事件处理。OK,但这个时候呢,呃,大家也想到,肯定不是连接,连接的事件呢,一般是读写IO读写的事件。第四一步当有新连接,当。当什么当有新的事件,新事件发生时?发生时。如果有新的事件发生了,我们这一个sub要做什么事情呢?来看一下,当然是sub。Sub。Sub reactor干什么呢?就会调用。调用什么对应的handler进行处理?
08:02
呃,就是说我们每个他会调自己对应的handle德尔进行处理,那么handle德尔下面的工作就和我们下面的工作就从这一级,就同学们看到这一集。这一集到这一集,其实就跟我们原先的前面讲的单reactor多线程是一样的了。那么handler干什么呢?Handler通过read。Read读取数据还是一样的,对吧,读取数据,读取数据过后呢,会分发给分分发。分发给什么呢?分发给后面的worker线程进行处理。Worker线程处理哪里呀,就是分配给。Worker线程池里面的一个worker线程进行处理。没问题吧,呃,当然了,呃,Worker线程就是我们说的worker线程。线程它呃会干什么呢?就是我们这个线,当然这个worker worker线程池,线程其实是worker线程池分配的,所以我们还是把这个加进就是worker线程词,就你们看到这个这个东西。
09:09
白色的walker先生是干什么呢?会分配分配。分配独立的还是独立的一个worker线程?县城干什么呀?现现场进行业务处理。业务处理并并返回结果,就说这个结果呢,还是要返回给我们这个三生这个handler的好,那么下一步当然很简单了,Handler他收到收到。呃,响应的结果后。相应的结果后干什么呢?再通过再。这个这个写啊,这个在在通过善的方法,善的方法将结果,结果返回给谁呀。这就是我们组从react的模式,大家一定要知道,呃,多说一句,就是react主线程,它是可以对应多个react主线程,也就是说一个main reactor下面可以有管理或者维护多个sub reactor,我把这句话写进去。
10:14
对,就是。嗯,怎么说呢,就是reactor主线程。Reactor这个主线程。组线程可以对应多个多个reactor子线程。县城。紫先生。呃,或者说你你可以这样理解,就是说一个main reactor可以管理多个sub及及什么呢?Main reactor。May reactor。Reactor可以管理或者说可以维护哈,可以管理或者维护吧,可以关联吧,这样比较好关联关联。
11:02
关联多个多个什么呀,Reactor。好,这就是我们组成的方说明,那下面呢,为了加深印象,我们再来看一本书,他是怎么讲的,有个叫sky IO in Java,这本书是不是特别有名,前面我们已经提到了,就是基于Java的可伸缩IO的,呃,一个一本书的讲解,他在里面也提到了一个multiple reactors的一个原理,就是多reactor的原理,我们把这个图,把这个书打开给大家看一下。这本书呢,我我大家看一下啊,在这里。就烫,打开。这本书呢,其实就把刚才我们讲的。整个reactor模型说的比较清晰。呃,在讲这本书之前呢,我们有必要跟大家说一下,这本书的作者叫道格理,那道理呢,这个人其实是作为我们学Java的人,尤其学并发的呢,必须知道的一个人,我简单的做一个介绍哈,这个人。
12:05
来看一下这个人。道里就这个人啊,他是一个老师啊,道里是老师美国的,然后呢,他是干什么呢,他这样子的。就是他的最大的最大的一个贡献是做了这么一件事情,大家看就是。诶,我们看看这有一个并发包,就是Java基础一个并发包都是他写的,我这下没写到啊,好像这没写到,我们直接看一下吧,看一下就是这。看到没有,Dog里呢,编写的U2.concurrentent这个包下面的所有的类其实都是他写的,也是这些API,就这个人写的。而且这个人呢,他有一点,有一个特别好的特点,他是很喜欢分享的,他说了一句话特别经典,他说分享知识和分享苹果不一样,苹果分享呢会越分越少,而知识的分享呢,是干什么呀,会。
13:06
会让知识的分享会能。更能激荡出不一样的火花。有一本书的作者叫effective。Java就是这这本书的作者呢,就特别感谢到道格里对Java发展做出的贡献,他写了一本书,我们来看一下,这本书呢,就是这个叫sc IO in Java,其实准确的讲,其实更多更多的是,呃,更多的是去分析了reactor模型是怎么回事,我们来看一下。这个地方就他说的,这是一个经典的service,经典的一个服务设计,就是我们传统的,然后紧接着他画了第二个图,下面有代码啊,我就不去念了。然后呢,我们再看这张图,这张图是basic reactor design,这个大家能对应到我们哪一块啊。就是这个是最基本的。
14:00
一个模型下面呢,接着再看。是不是还有这样一个accept?然后接着往下看吧。我们直接看我们关注的这个就行了,看这是worker。Thread pool,基于这个工作线程词的一种record模型。接着再往下面看,我们看关注的这个。好,同学们,这个其实就是我们刚才讲的主从react模型的另外一个图解,大家看是不是这有很多的client,他先找到main reactor main reactor的只处理X调用它的accept就是我们的接收器,把这个接收器处理完了过后呢,它会得到一个连接,然后把这个连接分配给某一个sub reactor。Reactor干什干什么事情呢?它读取数据。读取数据,读取数据过后,再去把读到的数据交给我们一个线程池,这就是我们所说的worker线程池,这个work线程池干什么事情呢?他做这样一些工作,看到没有,这这一个圈圈代表的就是业务处理。
15:12
代表的就是业务处理。他抽象了一下,业务处里面最关键的是一个抵扣的,就是解码,Computer,就是计算。N扣的就是编码,也就是他把这个数据干什么呢?把你的,因为这个网络传播数据往往是呃有编码的,于是他先解码,解码过后再做业务的处理,然后再编码,编码完了过后,你看这边有好几个,他画了三个,是不是一个两个,三个是不是这都是worker service。对吧,它会形成一个队列来处理,然后呢,他把这个返回的结果,呃,这个处理完的结果再返回给sub REC sub RA呢,再通这个S发给我们的兰,这条线应该这么看。啊,这个疝的锅到哪去了呢?到我们的钩端。这样的关系,好这个这本书呢,同学们有兴趣再去读一读哈,就是这本叫sky IO in Java。
16:05
还是很不错的,大家有兴趣的时间可以读读。最后呢,我们来总结一下主从reactor的优点和它的缺点。聊聊。主从reactor,它的优点当然不说了,副线程和子线程数据交互职责非常的明确,副线程也就是我们那个main reactor只负责。接收新的连接子线程,完成后续的业务。这是它的一个优点,第二在这个地方还有一点啊,主线程,它的数据的交互就是副线,副线程和子线程。的数据交互比较简单,主线程只需要把新的连接传给子线程,子线程无需再返回数据,也就这条线就没有了,哪条线呢?就是我把数据。我把这个链接交给你以后,你就做这个处理,跟我之间就不会有数据交互了。没有数据交互,现在看缺点,编程复杂度比较高,那么在实际的工作中,主从react。
17:04
多线程模型在哪里用?用到了呢?很多项目都广泛使用,比如说NS就用到了主从reactor多线程这种模型,Memory catch的主从。多线程模型,包括我们Nike,它呢也是。基于主从react模型来演变过来的,所以说我们也可以说nit也用到了主从多线程模型好。呃,最后呢,我们再对这个reactor模型做这三种模式,我们再用一个生活化的案例来理解,看怎么理解reactor。单单线程我们可以这样理解,就是前台接待员和服务员是同一个全程为顾客服务。单多线程呢,是前面有一个前台服务员。然后呢,有多个服务员。接待员。接待这个客户过后,把这个客户转给服务员就可以了,还有主从是前台有多个接待员,有多个服务生啊这样子的一种理解,Re模型,它有优点是响应快。
18:07
啊,不必为单个同步实验所阻塞。虽然说这有,那reactor本身依然是同步的,怎么办呢?因为你有多个了嘛,对不对,你下面有多个sub reactor,当然这个这个肯定就是。不会再阻塞了,说老师对于单个虽然是主塞,但是你这个主塞了,我可以调下一个sub reactor为他服务就行了。可以最大程度的避免复杂的多线程及同步问题,避免了多线程进程的切换啊,这个多线程和进程的切换开销就是频繁的切换。啊,你你还可以发挥多发挥这个多CPU的功能,扩展性也比较好,为什么呢?可以方便的通过增加react实力的个数来充分利用CPU,这句话怎么理解呢?就是刚才老师画的这个图,扩展性好是在这里,就是我这个模型建好以后。就这我这个模型建好以后。
19:00
那同学看到就这一大块儿。我可以根据需要,我可以根据需要增加。那我我如果说一个S,呃,子线程不够了,我再创建一个,如果再不够呢,我可以再来。是不是这个道理,好,这,这就是同时,甚至连这个都可以有多个哈。啊,就是包括我们,嗯,在Nike里面,他对这个改进了,在Nike的时候呢,这个主线人就叫做boss。呃,Boss group了,这个boss group其实也可以有多个的。这可可以再分级。那接着我们继续往往下看哈,接着接着往下看。还有一个就是复用性比较好,React模型本身与具体事件处理逻辑无关,具有很高的复用性,好同学们,那关于这一个主从reactor多先生模型呢,就给大家聊到这里,还是比较偏理论对不对?大家可能现在听起来还是很郁闷的一件事情,我还是那句话,其实你们觉得很郁闷,你要是自己去看,你会觉得更郁闷。
20:01
啊,就是这些东西呢,并并不是说大家一看就懂的,所以说老师呢,还是给大家走了一圈,下边呢,我们会讲这个ninety,因为你把现在有了react这个模型的基本基础知识过后呢,我们再去讲这个模型,大家就会很清晰,不要着急,这个讲完了过后我们会用代码,就是后面呢,我们会用代码来支撑,就是马上会写一个ni的,呃,基于ni一个TCP服务,在这个TCP服务这个代码里面呢,我们会通过这个代码反向再来找。这里面到底哪个是factor,它的队列又在哪里?然后呢,这边worker group里面又是怎么去运行的,要反向来推,就有代码,再回头看我们的模型,这样呢就会变得更加清晰好。所以说大家这块理论的东西呢,虽然有点繁琐,但是其实是一个比较重要的。比较重要的环节,面试官呢,他一般也不会说直接拿一段代码让你来看,他可能会问你,诶,请请你回答一下,或者说请你描述一下,请你描述一下,或或者甚至说让你画一个主从多线程的一个简单的原理图,你能画出来吗?你只要把这个图记住了,把这个老师呃说的这个流程记住,我想应该问题不大吧。
21:18
对不对,其实就是分层嘛,我们说了任何一个优化,其实要么就是加缓存,要么就是分级,就是如果你做开发做久了,你会发现基本就是这个套路,要么就是分层,要么就是加,要么就是加缓存来解决。好的同学们,那关于这块我们就聊到这里。
我来说两句