[纸上谈兵]Java IO详解(四) Reactor模式

一、 Reactor中文解释
Reactor模式翻译成中文有的说是反应器,有的说是反应堆模式。
中文解释
反应:因为事件所引发的回应。名词.
器: 容器, 例如:用来存放水之类的物体.
堆:   例如: 土堆.可以理解为土汇集到一起。
那么
反应器:这个我个人理解,存放反应的容器
反应堆:反应汇集到一起.
通过上面的解释来看,其实都差不多,个人理解叫反应器更合适一些,所以大家如果不太理解,可以先认为Reactor模式为反应器模式,即用一个容器来存储反应的模式。记住这个再往下看.

二、服务端处理流程
当服务端成功接受连接后,一般要经历以下流程: read, decode, compute, encode, send
read: 读到客户端发送的数据。
decode: 对客户端的数据进行解码.例如:http请求定义的请求头、请行、请求实体就是一个编码协议,对于http请求所谓解码也就是将请求的数据解析为请求头、请求行、请求实体的过程.
compute: 这个过程可以理解为实际的业务处理
encode: 编码,将服务端要响应给客户端的数据进行编码。编码的意思就是将数据转为服务端与客户端约定的数据格式要求。如http响应.
send: 即将编码好的数据发送给客户端。
"read, decode, compute, encode, send"每一个流程我们都代表一个事件

三、两种请求处理体系
基于线程的处理体系与事件驱动的处理体系
定义:
基于线程:使用多线程来处理客户端的请求,每当接收到一个请求,便开启一个独立的线程来处理.很明显BIO是这种体系,而且也只能应用这种体系。
优点:直观、简单
缺点:仅适用于并发访问量不大的场景,因为线程需要占用一定的内存资源,且操作系统在线程之间的切换也需要一定的开销,当线程数过多时显然会降低web服务器的性能.当线程在处理I/O操作,在等待输入的这段时间线程处于空闲的状态,同样也会造成cpu资源的浪费

可以看一下流程(该图与[服务端处理流程]中的内容一致,并非我个人画的,从网上找的)

事件驱动:定义一系列的事件处理器来响应事件的发生,并且将服务端接受连接与对事件的处理分离.事件是一种状态的改变.例如:java nio我个人理解就是基于事件驱动.

四、Reactor模式
Reactor设计模式,是在服务端使用的一种模式,一种基于事件驱动的设计模式。处理多个客户端并发的向服务端请求服务的场景。
Reactor模式思想:分而治之+事件驱动
分而治之:
事件驱动:

五、Reactor模式与Java NIO 关系
我个人理解,JavaNIO中可以采用Reactor模式,也可以不采用。JavaNIO为采用Reactor提供了基础支持。并非一提JavaNIO就是Reactor模式。

六、最简易Reactor模式图

详解: TODO

七、多线程 Reactor模式图

详解: TODO

八、主Reactor与多个Reactor模式图

详解: TODO

参考:
https://www.jianshu.com/p/eef7ebe28673
https://www.2cto.com/kf/201611/566900.html
https://www.cnblogs.com/doit8791/p/7461479.html
http://ryanflyer.iteye.com/blog/1672876

猜你喜欢

转载自blog.csdn.net/c364902709/article/details/81282785