`
maosheng
  • 浏览: 568090 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

高性能 IO 设计 Reactor 模式

NIO 
阅读更多
传统的服务器设计是:一连接一处理线程,也就是我们常说的 BIO 编程。BIO 在读取和发送时是阻塞的,在请求的整个生命周期内,不管有没有数据可读或待发送,都绑定和占用了这个处理线程。

BIO 多线程并发模式,一个连接一个线程的优点是:
  一定程度上极大地提高了服务器的吞吐量,因为之前的请求在read阻塞以后,不会影响到后续的请求,因为他们在不同的线程中。这也是为什么通常会讲“一个线程只能对应一个socket”的原因。另外有个问题,如果一个线程中对应多个socket连接不行吗?语法上确实可以,但是实际上没有用,每一个socket都是阻塞的,所以在一个线程里只能处理一个socket,就算accept了多个也没用,前一个socket被阻塞了,后面的是无法被执行到的。

BIO 多线程并发模式,一个连接一个线程的缺点是:
  缺点在于资源要求太高,系统中创建线程是需要比较高的系统资源的,如果连接数太高,系统无法承受,而且,线程的反复创建-销毁也需要代价。

改进方法是:

  采用基于事件驱动的设计,当有事件触发时,才会调用处理器进行数据处理。使用Reactor模式,对线程的数量进行控制,一个线程处理大量的事件。


传统模型中,线程的处理单元是一次完整的请求,为了把线程解放出来,Reactor 对这个处理单元进行了分解。


Reactor 之所以高效是因为采用了分而治之和事件驱动的设计。大部分网络服务像 Web 服务器、分布式对象的通信等大多数具有相同的基本处理流程:

读取请求数据 - read
按协议解析请求 - decode
业务处理 - process
按协议编码内容生成响应 - encode
发送响应 - send


1. 分而治之
Reactor 模式将处理过程分为多个小任务,每个任务执行一个非阻塞的操作,任务通常由一个 IO 事件触发执行。这种机制在 java.nio 中提供了支持:

非阻塞的读和写
调度与发生的 IO 事件关联的任务

BIO 线程是以 read->decode->process->encode->send 的顺序串行处理

NIO 将其分成了三个执行单元:读取、业务处理和发送,处理过程如下:
读取:如果无数据可读,线程返回线程池;发生读IO事件,申请一个线程处理读取,读取结束后处理业务

业务处理:线程同步处理完业务后,生成响应内容并编码,返回线程池

发送:发生写IO事件,申请一个线程进行发送

可以看出一个明显的区别就是,一次请求的处理过程是由多个不同的线程完成的,感觉和指令的串行执行和并行执行有点类似。

分而治之的关键在于非阻塞,这样就能充分利用线程,压榨 CPU,提高系统的吞吐能力。

2. 事件驱动
通常比其他模型更高效,它使用的资源更少,不用针对每个请求启用一条线程,减少了上下文切换,减少阻塞。但任务调度可能会慢,必须手动将事件和处理动作绑定。

通常编程比较困难,它必须为服务设计多个逻辑状态,以便跟踪和中断恢复,这也是在非阻塞编程中有大量状态机运用的原因。

NIO 中总共设计了 4 种事件,每个事件发生都会调度关联的任务,分别是:

OP_ACCEPT: 服务端监听到了一个连接,准备接收
OP_CONNECT: 客户端与服务器连接建立成功
OP_READ: 读事件就绪,通道有数据可读
OP_WRITE: 写事件就绪,可以向通道写入数据

java.nio 对事件驱动也提供了支持:
Channels: 连接到文件、Socket 等,支持非阻塞读取
Buffers: 类似数组的对象,可由通道直接读取或写入
Selectors: 通知哪组通道有 IO 事件
SelectionKeys: 维护 IO 事件的状态和绑定信息


3. Reactor 模式
Reactor 是一种设计模式,wikipedia 对其定义如下:

The reactor design pattern is an event handling pattern for handling service requests delivered concurrently to a service handler by one or more inputs. The service handler then demultiplexes the incoming requests and dispatches them synchronously to the associated request handlers.


Reactor 是一个或多个输入事件的处理模式,用于处理并发传递给服务处理程序的服务请求。服务处理程序判断传入请求发生的事件,并将它们同步的分派给关联的请求处理程序。

可以看出以下关键点 :

1)事件驱动(event handling)

2)可以处理一个或多个输入源(one or more inputs)

3)通过Service Handler同步的将输入事件(Event)采用多路复用分发给相应的Request Handler(多个)处理


Reactor 模式按照职责不同,通常可以把线程分为 Reactor 线程、IO 线程和业务线程:

Reactor 线程:轮询通知发生IO的通道,并分派合适的 Handler 处理
IO 线程:执行实际的读写操作
业务线程:执行应用程序的业务逻辑


自POSA2 中的关于Reactor Pattern 介绍中,我们了解了Reactor 的处理方式:

1)同步的等待多个事件源到达(采用select()实现)

2)将事件多路分解以及分配相应的事件服务进行处理,这个分派采用server集中处理(dispatch)

3)分解的事件以及对应的事件服务应用从分派服务中分离出去(handler)


基于Reactor Pattern 处理模式中,定义以下三种角色:

1)Reactor 将I/O事件分派给对应的Handler

2)Acceptor 处理客户端新连接,并分派请求到处理器链中

3)Handlers 执行非阻塞读/写 任务










分享到:
评论

相关推荐

    两种高性能IO设计模式(ReactorProactor)的比较

    两种高性能IO设计模式(Reactor和Proactor)比较 在高性能服务器设计中,I/O设计模式扮演着至关重要的角色。常见的I/O设计模式有阻塞型、非阻塞同步型和非阻塞异步型。其中,非阻塞异步型I/O设计模式是性能最高、...

    两种高性能IO设计模式(ReactorProactor)的比较.docx

    《两种高性能IO设计模式(Reactor/Proactor)的比较》 在构建高性能TCP服务器时,I/O设计模式的选择至关重要,因为它们直接影响系统的性能和可扩展性。本文主要对比了两种主要的I/O多路复用模式:Reactor和Proactor...

    高性能Server-Reactor模型.pdf

    高性能Server-Reactor模型是构建高效能网络服务的核心设计模式,尤其在Java领域中广泛应用。该模型主要用于解决C/S(客户端/服务器)架构中的高并发、低延迟问题,特别是在现代互联网应用如电子邮件、视频流媒体、...

    高性能Server---Reactor模型 _ 思考,执行,表达

    ### 知识点二:高性能IO模型 实现高性能服务器的基础之一就是高性能的I/O模型。I/O模型主要分为同步和异步两大类,其中同步I/O又可以分为阻塞和非阻塞两种,而异步I/O也可以分为阻塞和非阻塞两种。这些I/O模型在...

    Java NIO:浅析IO模型_动力节点Java学院整理

    本文将从同步和异步的概念开始,然后介绍阻塞和非阻塞的区别,接着介绍阻塞IO和非阻塞IO的区别,最后介绍五种IO模型和两种高性能IO设计相关的设计模式(Reactor和Proactor)。 一、同步和异步 同步和异步是IO模型...

    Scalable IO in Java.zip

    Scalable IO in Java是java.util.concurrent包的作者,大师Doug Lea关于分析与构建可伸缩的高性能IO服务的一篇经典文章,在文章中Doug Lea通过各个角度,循序渐进的梳理了服务开发中的相关问题,以及在解决问题的...

    Scalable IO in Java原文和翻译

    本文将深入解析这份文档及其翻译,带你理解Reactor模式的设计原理及其在Java中的应用。 首先,让我们了解什么是Scalable IO。在计算机科学中,可扩展性(Scalability)是指系统能够处理增加的工作负载,而不会降低...

    Socket高性能IO模型浅析

    (3)IO多路复用(IOMultiplexing):即经典的Reactor设计模式,有时也称为异步阻塞IO,Java中的Selector和Linux中的epoll都是这种模型。(4)异步IO(AsynchronousIO):即经典的Proactor设计模式,也称为异步非...

    scalable-io-in-java-中文1

    总之,Scalable IO in Java通过`java.nio`包提供的非阻塞IO和Reactor模式,为构建高性能、可扩展的网络服务提供了强大的工具。开发者需要理解和掌握这些技术,以便在设计大型、高并发的应用时做出明智的选择,实现...

    doug lea《Scalable IO in Java》

    《Scalable IO in Java》对于任何希望构建高性能、高并发Java应用的开发者来说,都是不可或缺的参考书籍。通过阅读和理解书中的内容,开发者不仅可以掌握Java NIO和Reactor模式的原理,还能学会如何在实际项目中应用...

    Libevent源码解析.pdf

    Reactor 模式是一种高效的事件处理机制,广泛应用于高性能服务器开发中。Reactor 模式的优点包括:高效、灵活、可扩展等。Reactor 模式的事件处理流程主要包括:事件注册、事件触发、事件处理三个阶段。 事件循环 ...

    网络服务设计模式

    分析常见高性能网络设计模式,涵盖了reactor, proactor。

    Java NIO与IO性能对比分析.pdf

    Java NIO的Reactor模式是实现高并发的关键。Reactor模式是一种事件驱动的架构模式,它具有事件分离器、事件处理器以及复用的事件队列。事件分离器负责监听事件的发生,事件处理器对相应的事件做出响应。在Java NIO中...

    Scalable IO in Java -Doug Lea

    在Java中实现可扩展的IO操作是一...通过深入理解Java NIO和Reactor模式,以及它们如何互相配合来处理网络IO事件,开发者可以构建出高效、可扩展且可靠的网络应用程序,满足现代分布式系统对于高性能和高可用性的要求。

    scalable-io-in-java-中文.pdf

    在深入探讨《Scalable IO in Java》的中文版内容之前,首先需要了解Java中的I/O模型发展历程及其在服务器编程中的重要性。...通过学习本书,开发者能够掌握如何在Java中实现高性能的服务器端程序,并理解其背后的原理。

    基于Java NIO反应器模式设计与实现

    Mina是一个完全由Java编写的NIO框架,而Netty则是由JBOSS提供的一个高性能的异步事件驱动的网络应用框架,它们都是基于Java反应器模式设计的,用于处理大量并发连接的场景。 综上所述,基于Java NIO的反应器模式...

    IO模型与性能分析

    ### IO模型与性能分析 #### 一、基本概念与背景 在探讨IO模型与性能分析之前,我们需要了解一些基础概念: - **时钟周期**:指的是一个时钟脉冲所持续的时间,它是衡量处理器速度的基本单位之一。 - **总线周期**...

    ScalableIOJava(NIO如何实现Selector模式的).pdf

    标题《Scalable IO in Java》和描述表明本文档讨论...通过理解Reactor模式以及如何在Java中通过NIO API实现这一模式,开发者可以构建出能够处理大量并发连接的应用程序,并达到高可伸缩性、高可用性以及高性能的目标。

Global site tag (gtag.js) - Google Analytics