Reactor模式中的5种组件

下图来自Douglas C. Schmidt的《Reactor  An Object Behavioral Pattern forDemultiplexing and Dispatching Handles for Synchronous Events》一文。

以下是借助翻译软件翻译的上述文章中的一部分内容,可能会有误差,请谨慎学习

Handles(句柄):

标识由操作系统管理的资源。这些资源通常包括网络连接、打开的文件、计时器、同步对象等。日志服务器中使用句柄来标识套接字终结点,以便同步事件解复用器可以等待事件发生。日志服务器感兴趣的两种类型的事件是连接事件和读取事件,它们表示传入的客户端连接和日志数据。日志服务器给每个客户端维护一个单独的连接。服务器中的每个连接都由一个套接字句柄表示。

Synchronous Event Demultiplexer(同步事件解复用器)

等待事件在一组Handles上发生的块。当可以在Handle上启动操作而不阻塞时返回。 用于I / O事件的多路复用器是select,这是UNIX和Win32 OS平台提供的多路复用系统调用。 select调用指示哪些Handles可以同步调用它们,而不会阻止应用程序进程。

Initiation Dispatcher(启动调度器)

定义用于注册,删除和调度事件处理程序的接口。 最终,同步事件多路分解器负责等待新事件发生。 当它检测到新事件时,去通知启动调度程序(Initiation Dispatcher)回调特定于应用程序的事件处理器。 常见事件包括连接接受事件,数据输入和输出事件以及超时事件。

Event Handler(事件处理器)

指定一个或多个由钩子方法组成的接口。抽象地表示调度操作特定于服务的事件。 此方法必须由特定于应用程序的服务实现。

Concrete Event Handler(具体事件处理器)

实现hook方法,以及在特定于应用程序中处理这些事件的方法。应用程序注册Concrete Event Handler和Initiation Dispatcher处理某些类型的事件。当这些事件到达时,Initiation Dispatcher回调Concrete Event Handler的hook方法。

这里的日志服务中有两个Concrete Event Handler:Logging Handler 和Logging Acceptor,Logging Handler负责接收和处理日志记录,Logging Acceptor创建并连接Logging Handler,它会处理后续来自客户端的日志记录。

在Reactor模式中发生以下的协作关系:

1)、当应用程序使用Initiation Dispatcher注册Concrete Event Handler时,应用程序会指示此事件处理程序希望Initiation Dispatcher通知它关于何时在关联的Handle上发生事件的事件类型。

2)、Initiation Dispatcher请求每个Event Handler传回其内部Handle。此Handle标识操作系统的Event Handler。

3)、当所有Event Handlers注册后,应用程序调用句柄事件(Handle-events)以启动Initiation Dispatcher的事件循环。 此时,Initiation Dispatcher结合了每个已注册的Event Handler的Handle,并使用同步事件多路分解器(Synchronous Event Demultiplexer)等待这些句柄上发生的事件。 例如,TCP协议层使用select同步事件多路分解操作来等待客户端记录事件到达连接的套接字句柄。

4)、当对应于事件源的句柄变为“准备好”时,同步事件多路分解器(Synchronous Event Demultiplexer)通知启动调度器(Initiation Dispatcher),例如,TCP套接字“准备好读操作”。

5)、Initiation Dispatcher触发Event Handler钩子方法以响应就绪句柄上的事件。 当事件发生时,Initiation Dispatcher使用由事件源激活的句柄作为“keys”来定位和分派适当的事件处理程序(Event Handler)的钩子方法。

6)、Initiation Dispatcher调用Event Handler的句柄事件(Handle-events)钩子方法来执行特定于应用程序的功能以响应事件。 发生的事件类型可以作为参数传递给方法,并由此方法在内部使用,以执行其他特定于服务的解复用和分派。 第9.4节描述了另一种调度方法。

以下交互图说明了Reactor模式中应用程序代码与参与者之间的协作:

---------------------------------------分割线---------------------------------------------------

下面的内容是张龙老师对Reactor模式中的5种组件的通俗解释

1、Handle(句柄或描述符):本质上是一种资源,由操作系统提供;该资源表示一个个的事件,比如文件描述符或是针对网络编程的socket句柄。事件既可以来自内部,也可以来自外部;外部事件比如客户端的连接请求,客户端发送过来的数据等;内部事件比如操作系统产生的定时器事件等。Handle是事件产生的发源地。

2、Synchronous Event Demultiplexer(同步事件分离器):它本身是一个系统调用,用于等待事件的发生(事件可能是一个也可能是多个),调用方在调用它的时候会被阻塞,一直阻塞到同步分离器上有事件产生为止。对于Linux来说,同步分离器指的是常用的I/O多路复用机制,比如select、poll、epoll等。在Java NIO中它对应的组件是Selector,对应的阻塞方法是select方法。

3、Event Handler(事件处理器):本身由多个回调方法构成,这些回调方法构成了与应用相关的对于某个事件的反馈机制。Netty相对于Java NIO来说在事件处理器这个组件上进行了升级,它提供了基础的事件处理器和大量的回调方法,供开发者在特定事件产生时去实现相应的业务逻辑。

4、Concrete Event Handler(具体事件处理器):是事件处理器的实现。在其内部实现了事件处理器的回调方法,进行业务逻辑处理。

5、Initiation Dispatcher(初始分发器):实际上就是Reactor角色。它本身定义了一些规范,这些规范用于控制事件的调度方式。同时又提供了应用进行事件处理器的注册、删除等操作。它本身是整个事件处理器的核心所在,Initiation Dispatcher会通过Synchronous Event Demultiplexer来等待事件的发生。一旦事件发生,Initiation Dispatcher首先会分离出每个事件,然后调用事件处理器,从而调用相关的回调方法来处理这些事件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值