1 源于生存的设计模式

咱们在生活中有一个十分不违心去然而却又不得不去的中央就是医院,咱们去医院看病须要经验一下流程:

第1步:挂号

第2步:期待叫号

第3步:找对应的医生讲述病情,医生依据症状开化验单

第4步:咱们带上化验单应用设施化验

第5步:期待化验后果进去之后咱们要拿上化验单再去找医生

第6步:医生依据化验后果隔靴搔痒。

每个人都不违心去医院,因为咱们感觉去医院十分麻烦,经验下面的流程一天的工夫就过来了,在这所有的流程中期待叫号和等化验后果工夫是最长的,有的化验单可能好几天能力进去,化验单进去之后也须要排队让医生看化验后果。

作为病人心愿到医院之后有一对一的服务,到医院之后有对应的医生给咱们全程跟踪看病。

然而如果咱们作为医院的管理者会怎么思考这个问题呢,医院的医生和设施数量是无限的,然而每天的病人却很多,基本上是医生的几十倍,如何应用无限的医生和设施资源解决更多病人的问题呢。

假如医院有10个医生,20台设施,医生执行第3步须要10分钟,执行第6步须要10分钟,设施执行第4步须要20分钟,第5步须要20分钟。如果医生接到病人之后给病人开化验单,而后等着病人出后果之后给病人开药,再送走,就是从第3步到第6步始终有医生跟着,这样会十分耗时,一个医生看一个病人须要破费 10+20+20+10=60分钟 的工夫,一天8小时只能给8病人看病,一个医院每天只能接待108=80个病人。然而如果医生开完化验单之后病人去化验这段时间给下个挂过号的病人看病,即执行完第3步之后,医生能够持续叫号执行第2步,病人拿到化验单之后即执行完第5步之后能够再去找医生执行第6步,这样就把资源充分利用起来了,一个医生看一个病人只须要精力第3步和第6不,破费10+10=20分钟,每天可能给860/20=24集体看病,整个医院每天能接待10*24=240个病人。这就是Reactor设计模式最外围的思维,解决了一对多的问题,大大晋升了资源的使用率。

【文章福利】须要C/C++ Linux服务器架构师学习材料加群1106747042(材料包含C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等)

2 Reactor设计模式实现

NIO是应用reactor设计模式十分经典的案例,传统的IO客户端过去一个连贯,服务端就须要专门一个线程来解决,每一个线程会将一次交互操作全副解决实现,包含读取和返回,外表上仿佛连贯不在线程外面,然而如果线程不够,新连贯将无奈失去解决。所以一个线程就肩负了连贯、读取、写入的责任。

这种解决模式海量并发的状况下即便引入线程池也不能满足需要,这个时候思考将一次残缺的申请切分为几个小的工作,就像医院把医生问诊和仪器查看离开一样,每个小工作都是非阻塞的,对于读写操作应用NIO对其进行读写。所以咱们把一次连贯操作拆分为多个工作,每个工作都是非阻塞的,这样就大大晋升了效率,然而这样做线程池中的线程数量业也会大大增长,然而线程更加简略且工作繁多,有点像咱们微服务的思维。

Reactor从线程池和Reactor的抉择上能够细分为:Reactor单线程模型,Reactor多线程模型,Reactor主从模型。

2.1 Reactor单线程模型

单线程模型是针对客户端申请应用一个专门的线程去解决,这个线程循环监听是否有客户端的申请到达,一旦收到客户端申请,将其分发给相应解决线程进行解决。这种模式采纳了基于事件驱动的设计,当有事件触发时才会调用处理器进行数据处理。应用Reactor模式能够对线程的数量进行管制,能够应用一个线程去解决大量的事件。

2.2 Reactor多线程模型

应用一个线程能够反对所有的IO解决,然而瓶颈也是不言而喻的,如果客户端屡次申请时在业务线程中解决较慢,后续的客户端会被积压,导致响应变慢,所以须要引入Reactor多线程模型。
能够将工作线程引入线程池,将处理器的执行放入线程池,并应用多线程解决业务逻辑。

2.3 Reactor主从模型

对于多个CPU的机器,为了充分利用系统资源会将Reactor拆分为两局部。

1)Main Reactor 负责监听连贯,将监听到的连贯交给Sub Reactor解决,主Reactor用于响应连贯申请。

2)Sub Reactor 解决连贯,从Reactor用于解决IO操作申请。

3 架构模型

Handle:操作系统的句柄,能够是关上的文件、一个Socket连贯、Timer定时器等。

Synchronous Event Demultiplexer :同步(多路)事件分离器,阻塞期待Handles中的事件产生。

Initiation Dispatcher :初始事件散发器,提供了注册、删除、转发Event Handler的办法

Event Handler :事件处理器的接口

Concrete Event Handler :事件处理器的理论实现,而且绑定了一个Handle。因为在理论状况中,咱们往往不止一种事件处理器,因而这里将事件处理器接口和实现离开,与C++、Java这些高级语言中的多态相似。

————————————————