一文弄懂-《Scalable IO In Java》

时间:2023-03-09 07:41:01
一文弄懂-《Scalable IO In Java》

目录

一. 《Scalable IO In Java》 是什么?

二. IO架构的演变历程

1. Classic Service Designs 经典服务模型

2. Event-driven Designs 事件驱动模型

3. Basic Reactor Design 最基本的响应设计

4. Worker Thread Pools:工作线程池模型

5. Using Multiple Reactors:多响应器模型

6. 文档后面讲解的buffer ByteBuffer channel Selector SelectionKey 其实就是整个NIO或者Netty 设计的核心



一. 《Scalable IO In Java》 是什么?

《Scalable IO In Java》 是java.util.concurrent包的作者,java界大师Doug Lea , 这是一篇关于分析和构建高性能的IO架构的文章。Netty/Mina 等高性能IO框架使用这种基于Reactor响应编程的框架,读懂这篇文档,有助于Netty/Mina服务框架的编程思想与设计模式

二. IO架构的演变历程

1. Classic Service Designs 经典服务模型

一文弄懂-《Scalable IO In Java》一文弄懂-《Scalable IO In Java》

这个架构图其实和我上一篇文章《一文弄懂-BIO,NIO,AIO》中讲到的 BIO 同步阻塞IO模式是一样的, 每个客户端去请求服务端,服务端进行一些读写等事件的操作,然后将结果同步返回给客户端

2. Event-driven Designs 事件驱动模型

一文弄懂-《Scalable IO In Java》一文弄懂-《Scalable IO In Java》

这个图可以联想到我们最初学习java的使用 用AWT开发界面,让然后为界面的每一个button绑定一个事件,这个想必学习java的同学都做过,之前我们在学校做的课程设计就是一个图书管理系统,那个就是用原生的AWT进行开发的,当点击某一个button的时候就会触发事件的执行,底层其实就是如图那样 有一个AWT线程监听的事件的发生

3. Basic Reactor Design 最基本的响应设计

一文弄懂-《Scalable IO In Java》一文弄懂-《Scalable IO In Java》

这个其实就是对应着我们java中的 NIO 编程,Reactor对应着java中的selector多路复用器 dispatch其实就是对应SelectionKey,客户端对服务发送的所有事件 都会放到Selector中 然后它根据不同的事件SelectionKey 进行做相应的处理 比如 read decode encode 操作

这里的acceptor相当于单独拿出一个线程来处理连接事件,一般连接事件比较少 所以连接事件和其他事件分为两个线程去实现

4. Worker Thread Pools:工作线程池模型

上面的一种设计 还有改进的地方 就是一般非连接事件会很频繁 有可能一个线程也处理不过来,那么我们在这里可以引入线程池,如下图

一文弄懂-《Scalable IO In Java》一文弄懂-《Scalable IO In Java》

这个就是一个工作线程池的图例,专门启动一个线程池去处理Reactor(Selector) 丢过来事件

5. Using Multiple Reactors:多响应器模型

相当于上面的那种架构 连接事件和其他事件 都要经过同一个Reactor, 那么为了减轻Reactor的压力 出现了下面的这种架构

一文弄懂-《Scalable IO In Java》一文弄懂-《Scalable IO In Java》

我们主Reactor只处理连接事件 子Reactor来处理其他事件

6. 文档后面讲解的buffer ByteBuffer channel Selector SelectionKey 其实就是整个NIO或者Netty 设计的核心