Java NIO 相关类图:
基于NIO的Socket请求处理过程:
Java NIO非堵塞技术实际是采取Reactor模式(反应器模式),或者说是观察者(observer)模式为我们监察I/O端口,如果有内容进来,会自动通知我们,这样,我们就不必开启多个线程死等,从外界看,实现了流畅的I/O读写,不堵塞了。
NIO 有一个主要的类Selector,这个类似一个观察者,只要我们把需要探知的socketchannel告诉Selector,我们接着做别的事情,当有事件发生时,他会通知我们,传回一组SelectionKey,我们读取这些Key,就会获得我们刚刚注册过的socketchannel,然后,我们从这个Channel中读取数据,接着我们可以处理这些数据。
Reactor模式是处理并发I/O比较常见的一种模式,用于同步I/O,中心思想是将所有要处理的I/O事件注册到一个中心I/O多路复用器上,同时主线程/进程阻塞在多路复用器上;一旦有I/O事件到来或是准备就绪(文件描述符或socket可读、写),多路复用器返回并将事先注册的相应I/O事件分发到对应的处理器中。
Reactor是一种基于事件驱动的设计模式,和普通函数调用的不同之处在于:应用程序不是主动的调用某个API完成处理,而是恰恰相反,Reactor逆置了事件处理流程,应用程序需要提供相应的接口并注册到Reactor上,如果相应的事件发生,Reactor将主动调用应用程序注册的接口,这些接口又称为“回调函数”。
Reactor模式与Observer模式在某些方面极为相似:当一个主体发生改变时,所有依属体都得到通知。不过,观察者模式与单个事件源关联,而反应器模式则与多个事件源关联。
在Reactor模式中,有5个关键的参与者:
描述符(handle):由操作系统提供的资源,用于识别每一个事件,如Socket描述符、文件描述符、信号的值等。在Linux中,它用一个整数来表示。事件可以来自外部,如来自客户端的连接请求、数据等。事件也可以来自内部,如信号、定时器事件。
同步事件多路分离器(event demultiplexer):事件的到来是随机的、异步的,无法预知程序何时收到一个客户连接请求或收到一个信号。所以程序要循环等待并处理事件,这就是事件循环。在事件循环中,等待事件一般使用I/O复用技术实现。在linux系统上一般是select、poll、epol_waitl等系统调用,用来等待一个或多个事件的发生。I/O框架库一般将各种I/O复用系统调用封装成统一的接口,称为事件多路分离器。调用者会被阻塞,直到分离器分离的描述符集上有事件发生。
事件处理器(event handler):I/O框架库提供的事件处理器通常是由一个或多个模板函数组成的接口。这些模板函数描述了和应用程序相关的对某个事件的操作,用户需要继承它来实现自己的事件处理器,即具体事件处理器。因此,事件处理器中的回调函数一般声明为虚函数,以支持用户拓展。
具体的事件处理器(concrete event handler):是事件处理器接口的实现。它实现了应用程序提供的某个服务。每个具体的事件处理器总和一个描述符相关。它使用描述符来识别事件、识别应用程序提供的服务。
Reactor 管理器(reactor):定义了一些接口,用于应用程序控制事件调度,以及应用程序注册、删除事件处理器和相关的描述符。它是事件处理器的调度核心。 Reactor管理器使用同步事件分离器来等待事件的发生。一旦事件发生,Reactor管理器先是分离每个事件,然后调度事件处理器,最后调用相关的模 板函数来处理这个事件。
可以看出,是Reactor管理器并不是应用程序负责等待事件、分离事件和调度事件。Reactor并没有被具体的事件处理器调度,而是管理器调度具体的事件处理器,由事件处理器对发生的事件作出处理。应用程序要做的仅仅是实现一个具体的事件处理器,然后把它注册到Reactor管理器中。接下来的工作由管理器来完成:如果有相应的事件发生,Reactor会主动调用具体的事件处理器,由事件处理器对发生的事件作出处理。
反应堆模式可以在软件工程层面,将事件驱动框架分离出具体业务,将不同类型请求之间用OO的思想分离。通常,反应堆不仅使用IO复用处理网络事件驱动,还会实现定时器来处理时间事件的驱动(请求的超时处理或者定时任务的处理)。
这幅图有5点意思:
(1)处理应用时基于OO思想,不同的类型的请求处理间是分离的。例如,A类型请求是用户注册请求,B类型请求是查询用户头像,那么当我们把用户头像新增多种分辨率图片时,更改B类型请求的代码处理逻辑时,完全不涉及A类型请求代码的修改。
(2)应用处理请求的逻辑,与事件分发框架完全分离。什么意思呢?即写应用处理时,不用去管何时调用IO复用,不用去管什么调用epoll_wait,去处理它返回的多个socket连接。应用代码中,只关心如何读取、发送socket上的数据,如何处理业务逻辑。事件分发框架有一个抽象的事件接口,所有的应用必须实现抽象的事件接口,通过这种抽象才把应用与框架进行分离。
(3)反应堆上提供注册、移除事件方法,供应用代码使用,而分发事件方法,通常是循环的调用而已,是否提供给应用代码调用,还是由框架简单粗暴的直接循环使用,这是框架的自由。
(4)IO多路复用也是一个抽象,它可以是具体的select,也可以是epoll,它们只必须提供采集到某一瞬间所有待监控连接中活跃的连接。
(5)定时器也是由反应堆对象使用,它必须至少提供4个方法,包括添加、删除定时器事件,这该由应用代码调用。最近超时时间是需要的,这会被反应堆对象使用,用于确认select或者epoll_wait执行时的阻塞超时时间,防止IO的等待影响了定时事件的处理。遍历也是由反应堆框架使用,用于处理定时事件。
- 大小: 49.4 KB
- 大小: 59.4 KB
- 大小: 142.8 KB
- 大小: 434.6 KB
分享到:
相关推荐
文章将探讨两种高性能I/O设计模式:Reactor和Proactor,并比较Java、C#和C++对这些设计模式的实现和性能。 阻塞型I/O设计模式的缺点是控制权只到调用操作结束了才会回到调用者手里,调用者被阻塞了,无法做任何其它...
主要用于解决高并发场景下的系统设计问题,而Java的NIO(Non-blocking Input/Output,非阻塞I/O)是Java平台提供的一种I/O模型,它支持基于事件的多路复用,为实现Reactor模式提供了基础。 Reactor模式的核心思想是...
在Java中,NIO(Non-blocking I/O)框架就是Reactor模式的一个典型应用,它允许一个线程处理多个通道(Channel)上的I/O事件,而不是为每个连接创建一个单独的线程。NIO中的Selector组件就是Reactor的核心,它能够...
总结来说,《Scalable IO in Java》文档是Java开发者提升I/O处理能力的重要参考资料,它涵盖了Reactor模式的多种实现,以及Java NIO库在其中的角色。通过深入学习和实践,我们可以更好地理解和利用这些技术,优化...
总的来说,Reactor模式适合于同步I/O环境,而Proactor模式利用异步I/O提供更高的并发性和性能。选择哪种模式取决于具体的应用场景和需求,例如服务器的并发连接数、系统资源限制以及对实时性的要求。在设计高性能...
总结,Java异步技术是提升系统效率的关键,从NIO的非阻塞I/O到高阶的`CompletableFuture`,再到事件驱动的Reactor模式,Java提供了丰富的工具和框架来应对各种异步编程场景。熟练掌握这些技术,能够帮助开发者构建出...
Reactor模式是处理大量并发连接的关键,它通过事件驱动的方式实现了非阻塞I/O,Understanding Reactor Pattern系列文章是深入理解这一模式的好资源。 Lock-Free编程是另一个关键领域,特别是在高并发和高性能系统中...
通过与 Reactor 3 的紧密集成,Spring WebFlux 能够有效地处理大量并发连接,显著减少资源消耗,非常适合 I/O 密集型场景。 ##### 3.2 Spring WebFlux的功能特性 - **响应式HTTP客户端和服务器端处理**:提供了...
Reactor模式是一种事件驱动的设计模式,用于处理多个并发I/O事件。在这种模式下,一个Reactor对象负责监听和分发I/O事件到相应的处理器。Reactor模式能够有效地处理大量的并发连接,避免了线程上下文切换的开销。 ...
这本书深入探讨了在Java环境中如何构建可扩展的输入/输出系统,特别关注了Reactor模式,这是一种用于处理大量并发I/O事件的设计模式。在现代网络应用程序中,有效地管理I/O操作是性能优化的关键,Doug Lea的这部作品...
Reactor模式允许单个线程高效地处理多个客户端的I/O事件。在Reactor模式中,通常有一个或多个事件处理器负责监听事件,然后将这些事件分发给相应的处理器进行处理。Reactor模式可以有不同的实现版本,包括基础模式、...
Proactor-Reactor 模式是高性能服务器设计的核心思想之一,它们都是基于 I/O 多路复用的技术实现的。下面我们来详细了解 Proactor-Reactor 模式的设计思想和实现机理。 问题背景 在设计高性能服务器时,如何处理...
在Netty中,通常采用主从Reactor模式。主Reactor主要负责监听服务器的监听套接字(NioServerSocketChannel),接收新进来的客户端连接,然后将这些连接分发给从Reactor。从Reactor则负责处理具体通道上的I/O事件,...
在Java中,I/O处理经历了从传统的BIO(阻塞I/O),到NIO(非阻塞I/O),再到AIO(异步I/O)的演变过程。本书所关注的主要是NIO,因为它是Java中实现可扩展网络服务的关键。 ### 关键知识点 1. **可扩展网络服务**...
Java NIO 2.0,也称为New I/O 2.0或NIO 2,引入了对异步I/O的支持,特别是在文件和网络I/O方面。在Java中,异步I/O的核心类和接口如下: 1. `AsynchronousChannel`:标记一个通道支持异步IO操作。 2. `...
Java NIO,全称Non-Blocking Input/Output,是非阻塞式输入输出,它是Java从1.4版本开始引入的一种新的I/O模型,为Java程序员提供了处理I/O操作的新方式。NIO的主要特点是其能够使Java程序以更有效的方式处理I/O流,...
**Reactor 模式简介**:Reactor 模型是一种常见的 I/O 多路复用技术,它的核心思想是通过注册事件到一个中央调度器(即 Reactor),当特定事件发生时,Reactor 会通知相应的处理程序去处理这些事件。这种模型非常...
Java NIO(New IO,也称为Non-blocking IO)和传统的Java IO是Java编程语言中用于处理I/O操作的两种主要技术。随着互联网用户数量的激增,企业对应用程序的并发处理能力提出了更高的要求。为了解决传统Java IO模型在...