Netty系列
Netty序列会将网络相关知识都介绍一下,后续还会有实战以及部分源码分析,欢迎大家关注、点赞
《Scalable IO in Java》 是什么
《Scalable IO In Java》是java.util.concurrent包的作者,java界大师Doug Lea 编写, 这是一篇关于分析和构建高性能的IO架构的文章。Netty/Mina 等高性能IO框架使用这种基于Reactor响应编程的框架,读懂这篇文档,有助于Netty框架的编程思想与设计模式。原文连接
网络请求
在一般的网络或分布式服务等应用程序中,都具备一些相同的请求处理流程,例如:
-
读取请求数据; -
对请求数据进行解码; -
对数据进行处理; -
对回复数据进行编码; -
发送回复;
在实际应用中每一步的运行效率都是不同的,例如其中可能涉及到xml解析、文件传输、web页面的加载、计算服务等不同功能,接下来我们来聊聊集中网络请求的模型。
传统的服务
在传统的网络服务中都会为每一个连接的处理开启一个新的线程,如下图:经典的Socket Server服务,就是每一个客户端连接的处理都会对应分配一个新的线程。对于传统的服务设计,每个请求都需要从新开启一个新的线程处理,导致整体的性能不够,此外对于整体的任务的执行颗粒也比较大,整体的耗时也过长,针对这种这种情况,大师提出分治法。
分治
分治具有以下几个特点:
-
将一个完整处理过程分解为一个个细小的任务; -
每个任务执行相关的动作且不产生阻塞; -
在任务执行状态被触发时才会去执行,例如只在有数据时才会触发读操作;
java.NIO实现了该机制:
-
非阻塞的读和写; -
通过感知IO事件分发任务的执行;
事件驱动
事件驱动模式下不需要为每一个客户端建立一个线程,这意味这更少的线程开销,以及更少的上下文切换,但任务的调度可能会慢一些,通常实现的复杂度也会增加,事件驱动模式可以理解为类似与GUI的事件驱动机制,但是该模式也不可能把所有阻塞都消除掉。由于是基于事件驱动的,因此需要跟踪服务的相关状态;
Reactor模式
Reactor以下几个特点:
-
Reactor模式中会通过分配不同的Handler来响应IO事件,类似与AWT 事件处理线程; -
每个Handler都是非阻塞的操作,类似于AWT ActionListeners 事件监听; -
通过将Handler绑定到事件进行管理,类似与AWT AddActionListener 添加事件监听;
单线程模式
单线程模式下,Acceptor负责建立Client和Server连接请求,Dispatch负责分发IO事件,处理IO过程是非阻塞的。该模型对应我们Java中NIO的模型设计,Reactor对应Java中的Selector多路复用器,Dispatch对应SelectionKey,负责IO事件的状态与绑定 ,客户端对服务发送的所有事件,都会放到Selector中,然后它根据不同的事件SelectionKey,对相应的事件。这里的Acceptor相当于单独的一个线程来处理连接事件,一般连接事件比较少,所以连接事件和其他事件分为两个线程去实现。
多线程模式
在单线程模式下,如果非IO事件频繁 有可能导致Handler处理不过来,从而影响到Reactor线程,因此引入多线程模式,多线程模式分为两种:Worker Threads和Multiple Reactor Threads。
Worker Threads
Worker Threads模式具备以下几个特点:
-
通过拆分非IO处理,提高Reactor线程的处理速度; -
使用线程池设计,方便了Handler的实现,在单线程下通过事件驱动,Handler的实现必须依照Reactor中的要求; -
对于IO的处理比较困难,最好是一开始就读取到所有的输入到一个缓冲区内; -
使用线程池可以对线程进行调优与控制,正常情况服务的情况下需要线程更少;
Multiple Reactor Threads
Multiple Reactor Threads是对Worker Threads的增强,多个Reactor可以根据实际情况去匹配调节CPU处理与IO读写的效率,提高系统资源的利用率;每个Reactor都包含对应的Selector,Thread,Dispatchloop;一个处理Accpet连接的mainReactor线程,多个处理IO事件的subReactor线程。
结束
欢迎大家点点关注,点点赞!
原文始发于微信公众号(既然遇见不如同行):《Scalable IO in Java》
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/52275.html