您的位置:首页 > Web前端 > React

reactor

2016-02-02 13:06 447 查看

对于同步事件的多路复用和分发的面向对象的行为模式

这篇文章早期的版本作为一章出现在“Pattern Languages of Program Design” ISBN 0-201-6073-4, 编辑 Jim Coplien and Douglas C. Schmidt由 Addison-Wesley出版, 1995.

1 意图

Reactor模式是用来处理由一个或多个客户端并发向一个应用递交的服务请求。一个应用中的每个服务可能由几个方法组成,每个服务由不同的分发服务请求的事件处理器代表。

2 众所周知的

调度器,通知器

3 例子

为了说明reactor模式,考虑一个事件驱动的服务器用于分布式的日志服务。如下图1.



在分布式环境中的客户端应用程序使用日志服务来记录他们的状态信息。状态信息通常包含错误通知,调试跟踪,性能报告。日志记录会被发送到一个中央日志服务器,它会将记录写到不同的输出设备,例如控制台,打印机,文件或数据库。

日志服务器与客户端采用面向连接的协议进行交互,例如TCP。想记录日志的客户端必须先向服务器发送连接请求。服务器使用在客户端已知的地址上监听的“处理工厂”来等待这些连接请求。当一个连接请求到达,“处理工厂”会在客户端服务器间建立一个连接,通过创建一个新的处理器,用它来代表一个连接的端点。之后等待客户端请求的处理器会返回到服务器端。一旦客户端连接上了,他们可以并发的发送日志记录到服务器端。服务器通过连接着的socket处理器们来接受数据。

或许最直观的开发并发的日志服务器的方法是使用可以并发处理多个客户端的多线程,就像以下图2所示。



这种方法同步的接受网络连接,大量产生“一个线程一个连接”来处理客户端连接。可是,使用多线程来处理日志记录的服务器不能解决如下压力:

3.1 效率:线程处理可能由于上下文切换,同步,数据移动导致低性能

3.2 编程的简单性:线程处理可能需要复杂的并发控制机制

3.3 可移植性:线程处理并不是在所有的操作系统上都可以支持的。

由于这些缺点,对于开发一个并发的日志服务器,多线程处理通常不是最有效的也不是复杂度最小的解决方案。

4 上下文

一个在分布式系统的服务器的应用程序,它并发的收到来自一个或多个客户端的事件。

5 问题

5.1 可用性:服务器必须有能力去处理进来的请求及时它在等待其他将要到来的请求。尤其是,一个服务器不可以无限期的处理任何单一事件的来源而排除其他的事件来源,因为这样可能会延迟其他客户端的响应。

5.2 效率:一个服务器必须最小延迟,最大吞吐量,避免不必要的使用cpu。

5.3 编程简单性:服务器的设计必须使使用适当的并发策略简单化。

5.4 适应性:整合新的或改进的服务,例如改变消息格式或者增加服务器端的缓存,对于已存在的代码应该只引发最小的修改和维护的成本。

例如实现新的服务不应该需要修改通用的事件多路复用和分发的机制。

5.5 可移植性:移植一个服务器到一个新的操作系统不应该需要显著地努力。

6 解决方案

事件的同步多路复用和他们对应的事件处理器的分发整合在一起。另外,从通用的事件多路复用和分发机制解耦 专用于分发 和 服务的实现。

对于应用程序的提供的每个服务,引入单独的用于处理某种类型事件的事件处理者。所有的事件处理者实现相同的接口。事件处理者向初级分发器注册,初级分发器使用同步事件多路复用器来等待事件的到来。当事件到来,这个同步事件多路复用器通知初级分发器,初级分发器同步回调关联的事件的事件处理者。之后事件处理者分发这个事件到实现请求服务的方法。

7 结构

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: