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

Reactor构架模式及框架概述

 
阅读更多

Reactor框架是ACE各个框架中最基础的一个框架,其他框架都或多或少地用到了Reactor框架。本文分析Reactor构架模式的基本原理。

2.1Reactor构架模式

对每一个构架模式的分析,我们都使用参考文献的分析风格,着重分析意图、上下文、问题、解决方案、结构和实现 6个方面的内容。而实现就是ACE源代码。

1. 意图

在事件驱动的应用中,将一个或多个客户的服务请求分离(demultiplex)和调度(dispatch)给应用程序。

2. 上下文

在事件驱动的应用中,同步地、有序地处理同时接收的多个服务请求。

3. 问题

在分布式系统尤其是服务器这一类事件驱动应用中,虽然这些请求最终会被序列化地处理,但是必须时刻准备着处理多个同时到来的服务请求。在实际应用中,这些请求总是通过一个事件(如CONNECTOR、READ、WRITE等)来表示的。在有序地处理这些服务请求之前,应用程序必须先分离和调度这些同时到达的事件。为了有效地解决这个问题,我们需要做到以下4方面:

  • 为了提高系统的可测量性和反应时间,应用程序不能长时间阻塞在某个事件源上而停止对其他事件的处理,这样会严重降低对客户端的响应度。
  • 为了提高吞吐量,任何没有必要的上下文切换、同步和CPU之间的数据移动都要避免。
  • 引进新的服务或改良已有的服务都要对既有的事件分离和调度机制带来尽可能小的影响。
  • 大量的应用程序代码需要隐藏在复杂的多线程和同步机制之后。

4. 解决方案

在一个或多个事件源上等待事件的到来,例如,一个已经连接的Socket描述符就是一个事件源。将事件的分离和调度整合到处理它的服务中,而将分离和调度机制从应用程序对特定事件的处理中分离开,也就是说分离和调度机制与特定的应用程序无关。

具体来说,每个应用程序提供的每个服务都有一个独立的事件处理器与之对应。由事件处理器处理来自事件源的特定类型的事件。每个事件处理器都事先注册到Reactor管理器中。Reactor管理器使用同步事件分离器在一个或多个事件源中等待事件的发生。当事件发生后,同步事件分离器通知Reactor管理器,最后由Reactor管理器调度和该事件相关的事件处理器来完成请求的服务。

5. 结构

在Reactor模式中,有5个关键的参与者。

  • 描述符(handle):由操作系统提供,用于识别每一个事件,如Socket描述符、文件描述符等。在Linux中,它用一个整数来表示。事件可以来自外部,如来自客户端的连接请求、数据等。事件也可以来自内部,如定时器事件。
  • 同步事件分离器(demultiplexer):是一个函数,用来等待一个或多个事件的发生。调用者会被阻塞,直到分离器分离的描述符集上有事件发生。Linux的select函数是一个经常被使用的分离器。
  • 事件处理器接口(event handler):是由一个或多个模板函数组成的接口。这些模板函数描述了和应用程序相关的对某个事件的操作。
  • 具体的事件处理器:是事件处理器接口的实现。它实现了应用程序提供的某个服务。每个具体的事件处理器总和一个描述符相关。它使用描述符来识别事件、识别应用程序提供的服务。
  • Reactor管理器(reactor):定义了一些接口,用于应用程序控制事件调度,以及应用程序注册、删除事件处理器和相关的描述符。它是事件处理器的调度核心。Reactor管理器使用同步事件分离器来等待事件的发生。一旦事件发生,Reactor管理器先是分离每个事件,然后调度事件处理器,最后调用相关的模板函数来处理这个事件。

通过上述分析,我们注意到,是Reactor管理器而不是应用程序负责等待事件、分离事件和调度事件。实际上,Reactor管理器并没有被具体的事件处理器调用,而是管理器调度具体的事件处理器,由事件处理器对发生的事件做出处理。这就是类似Hollywood原则的“反向控制”。应用程序要做的仅仅是实现一个具体的事件处理器,然后把它注册到Reactor管理器中。接下来的工作由管理器来完成。这些参与者的相互关系如图2-1所示。

现在结合第1章分析的框架五元素来看一下Reactor构架模式的参与者与框架五元素之间的关系:Reactor构架模式的具体实现对应了元素1;事件处理器接口对应元素2;具体的事件处理器对应元素3;Reactor管理器使用了Hollywood原则,可以认为和元素5对应;元素4的功能相对不明显,没有明确的对应关系。

如果还是没有理解Reactor构架模式,没有关系,源代码会说明所有问题。此时可再分析一遍Reactor构架模式,然后继续以下内容。


图2-1 Reactor构架模式结构图

2.2Reactor框架概述

从对Reactor构架模式的分析中我们可以看出,要设计和实现一个简单Reactor框架以支持I/O事件,需要实现两个组件:事件处理器接口和Reactor管理器。至于其他组件,如同步事件分离器可以使用操作系统提供的select、poll或其他类似的函数;而描述符可以使用文件描述符或其他可以识别事件的数据结构,一般操作系统都会提供。事件处理器接口包含一系列模板函数,可以根据实际处理的数据进行设计;Reactor管理器肩负着事件的分离和调度,是整个框架设计的核心。

ACE的Reactor框架在Linux平台下使用文件描述符作为I/O事件的描述符,使用ACE_Event_Handler类作为各类事件的处理器接口。将同步事件分离函数放到Reactor管理器中,这样使用不同的同步事件分离函数就需要实现不同的Reactor管理器。ACE使用Bridge设计模式解决了这一问题,将与同步事件分离函数相关的操作放到Bridge设计模式的Implementor中。凡是ACE支持的同步事件分离函数都会有一个具体的Implementor与之对应。

ACE的Reactor管理器还提供了用于实现Singleton设计模式的操作,使用这些操作时,一个进程只能有一个全局的Reactor管理器。在调用Singleton设计模式接口时,Reactor管理器会在启动时根据操作系统的配置选择一个具体的Implementor。当然,如果你不喜欢这个默认的Implementor,可以通过函数进行更换。为了提高整个系统对事件分离和调度的性能,ACE还允许应用程序创建多个Reactor管理器实例。在这种情况下,应用程序将不能调用用于Singleton设计模式的操作,只能直接使用Reactor管理器实例对象的方法实现对事件的分离和调度。同时提供这两种使用方法,可以最大程度地满足应用程序的苛刻要求。

ACE实现的Reactor框架结构要比Reactor构架模式中分析的结构复杂得多。这是因为ACE的Reactor框架除了处理I/O事件之外,还要处理定时器、信号量等常见的事件,并且所有的这些处理都必须满足跨平台的要求。要将对这些事件的处理抽象出来,并且提供给应用程序一个统一的接口,ACE的Reactor管理器的实现还采用了Facade设计模式。实际上,Reactor框架管理的I/O事件、信号量事件、定时器事件和Notify事件在实现上都有一个小的组件与之对应,这样可以将Reactor管理器与具体的事件处理解耦。使用Facade设计模式,将这些小的组件的接口封装起来,使得应用程序无法感知它们的存在,可以减少应用程序处理对象的数目,并且使得这些小的组件使用起来更加方便。

以上分析的3种设计模式以及Factory设计模式,在ACE的框架管理器的实现中被频繁使用。这些设计模式以及它们的使用,既为我们学习设计模式提供了非常好的场景,又为我们实现软件框架管理器提供了实用的方法。ACE的Reactor框架与框架五元素的对应关系非常密切,是一个典型的事件驱动型框架,它为我们打开了ACE的框架之门,是学习其他框架的基础。

在深入到框架代码之前,我们先来看一个Reactor框架的使用示例,示例虽然简单,但却提供了一个实实在在的应用程序,也为我们的分析提供了一些思路。

---------------------------------------------

本文节选自《ACE技术内幕:深入解析ACE架构设计与实现原理》,作者:潘荣。

内容简介:本书从构架模式、编程示例和源代码3个维度系统地对经典网络框架ACE(Adaptive Communication Environment)的架构设计和实现原理进行了深入分析,它能解决4个方面的问题:第一,帮助框架设计者领略软件框架设计的普适原则和思想,进而设计出自己的软件框架;第二,帮助ACE应用开发人员加深对ACE框架的理解,提升开发水平,更好地去定制和扩展ACE框架,以及解决C++网络通信中的难题;第三,帮助C++开发人员加深C++语言功底,书中有大量对C++源代码的分析,包括网络编程、动态库编程和异步编程等,还涉及10余个经典的设计模式的解析;第四,增强平台开发人员和软件架构师的技术修养,ACE的设计和实现都极其优秀,它的实现源码和架构思想非常值得去学习和研究。

全书一共7章,详细分析了ACE的Reactor、Service Configurator、Task、Acceptor_Connector、Proactor和Streams等6个框架的架构设计与实现原理。每个框架的分析分为3部分:第一,框架的设计分析,每个框架(除Task框架)都有一个构架模式与之对应,构架模式阐述了框架的设计原理,给出了框架的总体结构,是学习框架的理论基础;第二,框架的应用分析,每个框架都有一个应用实例与之对应,应用实例既帮助读者了解框架的使用方法,又为读者提供了一个可以调试的应用程序,便于读者使用调试器探索框架的内部秘密;第三,框架的实现分析,这是本书的重点,对框架的实现原理进行了详细的分析,并且对重点的类和流程给出了UML类图和UML顺序图,可以让读者在短时间内掌握框架的实现技术。

互动网购买:http://product.china-pub.com/3662472

分享到:
评论

相关推荐

    Easy-Reactor是一个基于Reactor模式的Linux C++网络服务器框架

    Easy-Reactor是一个基于Reactor模式的Linux C++网络服务器框架,支持多线程TCP服务器,单线程TCP服务器,单线程UDP服务器等形式,可以让使用者完全专注于业务,快速开发出一个高效的服务器应用。 在工作中开发基础...

    基于Reactor框架的C++服务器项目.zip

    基于Reactor框架的C++服务器项目.zip基于Reactor框架的C++服务器项目.zip基于Reactor框架的C++服务器项目.zip基于Reactor框架的C++服务器项目.zip基于Reactor框架的C++服务器项目.zip基于Reactor框架的C++服务器项目...

    Reactor模式和NIO

    Reactor模式是一种事件驱动的设计模式,主要用于解决高并发场景下的系统设计问题,而Java的NIO(Non-blocking Input/Output,非阻塞I/O)是Java平台提供的一种I/O模型,它支持基于事件的多路复用,为实现Reactor模式...

    reactor框架推送式框架文档

    7. 调试 Reactor 应用程序涉及阅读堆栈跟踪、启用调试模式以及日志记录流,这对于理解和解决运行时问题非常有用。 8. 高级特性与概念部分深入探讨了操作符的复用、热与冷流的区别、使用 `ConnectableFlux` 广播、...

    20120815_Reactor模式及在DSS中的体现1

    《Reactor模式及其在分布式系统服务(DSS)中的应用》 Reactor模式是一种重要的并发处理模式,尤其在处理I/O密集型任务时表现出色。它以事件驱动为基础,核心思想是通过反转事件处理流程,使得系统能够高效地处理...

    Easy-Reactor是一个Linux C++高性能TCP服务框架.zip

    Easy-Reactor是一款基于Linux环境的C++高性能TCP服务框架,它采用Reactor模式,旨在简化多并发网络连接的处理,提供高效、稳定的服务。本文将深入探讨Easy-Reactor的设计理念、核心功能以及其实现方式。 一、...

    tpd_reactor_proactor.pdf

    "Reactor 和 Proactor 模式在网络编程中的应用" Reactor 和 Proactor 模式是两种常见的事件处理模式,在网络编程中广泛应用于设计高效、可靠的并发和网络应用程序。在本文中,我们将详细介绍 Reactor 和 Proactor ...

    linux C++ 基于Reactor事件机制的网络编程框架源码.zip

    linux C++ 基于Reactor事件机制的网络编程框架源码.zip。linux网络编程框架(C++)基于Reactor事件机制,支持线程池,异步非阻塞,高并发,高性能。linux C++ 基于Reactor事件机制的网络编程框架源码.zip。linux网络...

    Reactor Pattern (一)

    在Java中,NIO(Non-blocking I/O)框架就是Reactor模式的一个典型应用,它允许一个线程处理多个通道(Channel)上的I/O事件,而不是为每个连接创建一个单独的线程。NIO中的Selector组件就是Reactor的核心,它能够...

    Proactor模式&Reactor模式详解

    ### Proactor模式&Reactor模式详解 #### 一、引言 在服务器端编程领域,构建高效的输入/输出(I/O)模型对于提高程序性能至关重要。根据数据传输方式的不同,通常将I/O模型分为四类:同步阻塞I/O、同步非阻塞I/O、I...

    reactor-siemens.pdf

    #### 二、Reactor模式概述 **意图:** Reactor模式处理客户端并发发送至应用程序的服务请求。每个服务可能包含多个方法,并由单独的事件处理器负责处理特定的服务请求。事件处理器的调度由初始化调度器完成,而服务...

    Easy-Reactor是一个Linux C++高性能TCP服务框架,基于Reactor模式,支持单线程、多线程Reactor

    Easy-Reactor是一个Linux C++高性能TCP服务框架,基于Reactor模式,支持单线程、多线程Reactor,也支持UDP服务 C++是一种广泛使用的编程语言,它是由Bjarne Stroustrup于1979年在新泽西州美利山贝尔实验室开始...

    Reactor 3中文帮助文档

    在React框架中,Reactor是其核心库之一,专门用于构建响应式应用程序。本篇文章将详细解读Reactor 3的中文帮助文档,帮助用户理解非阻塞响应式框架的使用方法及其原理,尤其是Spring WebFlux底层实现的相关知识。 ...

    .NET Reactor 4.9 破解版

    .NET Reactor是一款功能强大的代码保护以及许可授权管理系统软件,主要用于开发人员保护其.NET软件程序,.NET Reactor支持所有支持.NET编译的程序开发语言。 .NET Reactor 4.9是目前最新版本,由大神yoza破解,亲测...

    netty 入门Reactor示例

    在深入理解Netty的Reactor模式之前,我们先了解一下什么是Reactor模式。 Reactor模式是一种事件处理模式,它允许系统同时处理多个连接请求,通过将连接请求分派到相应的处理器来提高系统的并发性。在Java中,NIO...

    Observer and Reactor 观察者和recator的比较

    "Observer(观察者)"和"Reactor(反应器)"是两种广泛应用于并发和事件驱动编程的设计模式。 Observer模式的核心在于定义了一对多的依赖关系,当一个对象(主题)的状态发生改变时,所有依赖于它的对象都会被自动...

    reactor模式源码

    `reactor-LF`可能代表了Reacttor模式的一种具体实现,LF可能是“Level-Fair”或“Lock-Free”的缩写,暗示着这个实现可能采用了公平的调度策略或者无锁的数据结构,以进一步优化性能。 在阅读和理解Reacttor模式的...

    Reactor教程Mono和Flux例子

    Reactor是Spring框架的一部分,它是一个响应式编程库,用于构建非阻塞、高并发、事件驱动的应用程序。在Java生态系统中,Reactor是实现 Reactive Streams 规范的一个关键工具,它提供了Mono和Flux两种核心类型来处理...

Global site tag (gtag.js) - Google Analytics