IO设计模式:Reactor和Proactor对比
平时接触的开源产品如Redis、ACE,事件模型都使用的Reactor模式;而同样做事件处理的Proactor,由于操作系统的原因,相关的开源产品也少;这里学习下其模型结构,重点对比下两者的异同点;
反应器Reactor
Reactor模式结构
Reactor包含如下角色:
- Handle 句柄;用来标识socket连接或是打开文件;
- Synchronous Event Demultiplexer:同步事件多路分解器:由操作系统内核实现的一个函数;用于阻塞等待发生在句柄集合上的一个或多个事件;(如select/epoll;)
- Event Handler:事件处理接口
- Concrete Event HandlerA:实现应用程序所提供的特定事件处理逻辑;
- Reactor:反应器,定义一个接口,实现以下功能:
1)供应用程序注册和删除关注的事件句柄;
2)运行事件循环;
3)有就绪事件到来时,分发事件到之前注册的回调函数上处理;
“反应”器名字中”反应“的由来:
“反应”即“倒置”,“控制逆转”,具体事件处理程序不调用反应器,而是由反应器分配一个具体事件处理程序,具体事件处理程序对某个指定的事件发生做出反应;这种控制逆转又称为“好莱坞法则”(不要调用我,让我来调用你)
业务流程及时序图
- 应用启动,将关注的事件handle注册到Reactor中;
- 调用Reactor,进入无限事件循环,等待注册的事件到来;
- 事件到来,select返回,Reactor将事件分发到之前注册的回调函数中处理;
主动器Proactor
Proactor模式结构
Proactor主动器模式包含如下角色
- Handle 句柄;用来标识socket连接或是打开文件;
- Asynchronous Operation Processor:异步操作处理器;负责执行异步操作,一般由操作系统内核实现;
- Asynchronous Operation:异步操作
- Completion Event Queue:完成事件队列;异步操作完成的结果放到队列中等待后续使用
- Proactor:主动器;为应用程序进程提供事件循环;从完成事件队列中取出异步操作的结果,分发调用相应的后续处理逻辑;
- Completion Handler:完成事件接口;一般是由回调函数组成的接口;
- Concrete Completion Handler:完成事件处理逻辑;实现接口定义特定的应用处理逻辑;
业务流程及时序图
- 应用程序启动,调用异步操作处理器提供的异步操作接口函数,调用之后应用程序和异步操作处理就独立运行;应用程序可以调用新的异步操作,而其它操作可以并发进行;
- 应用程序启动Proactor主动器,进行无限的事件循环,等待完成事件到来;
- 异步操作处理器执行异步操作,完成后将结果放入到完成事件队列;
- 主动器从完成事件队列中取出结果,分发到相应的完成事件回调函数处理逻辑中;
对比两者的区别
主动和被动
以主动写为例:
Reactor将handle放到select(),等待可写就绪,然后调用write()写入数据;写完处理后续逻辑;
Proactor调用aoi_write后立刻返回,由内核负责写操作,写完后调用相应的回调函数处理后续逻辑;
可以看出,Reactor被动的等待指示事件的到来并做出反应;它有一个等待的过程,做什么都要先放入到监听事件集合中等待handler可用时再进行操作;
Proactor直接调用异步读写操作,调用完后立刻返回;
实现
Reactor实现了一个被动的事件分离和分发模型,服务等待请求事件的到来,再通过不受间断的同步处理事件,从而做出反应;
Proactor实现了一个主动的事件分离和分发模型;这种设计允许多个任务并发的执行,从而提高吞吐量;并可执行耗时长的任务(各个任务间互不影响)
优点
Reactor实现相对简单,对于耗时短的处理场景处理高效;
操作系统可以在多个事件源上等待,并且避免了多线程编程相关的性能开销和编程复杂性;
事件的串行化对应用是透明的,可以顺序的同步执行而不需要加锁;
事务分离:将与应用无关的多路分解和分配机制和与应用相关的回调函数分离开来,
Proactor性能更高,能够处理耗时长的并发场景;
缺点
Reactor处理耗时长的操作会造成事件分发的阻塞,影响到后续事件的处理;
Proactor实现逻辑复杂;依赖操作系统对异步的支持,目前实现了纯异步操作的操作系统少,实现优秀的如windows IOCP,但由于其windows系统用于服务器的局限性,目前应用范围较小;而Unix/Linux系统对纯异步的支持有限,应用事件驱动的主流还是通过select/epoll来实现;
适用场景
Reactor:同时接收多个服务请求,并且依次同步的处理它们的事件驱动程序;
Proactor:异步接收和同时处理多个服务请求的事件驱动程序;
类图和序列图的源文件提供下载,详见Github《图说设计模式》的EA文档:
https://github.com/me115/design_patterns
参考
《面向模式的软件体系结构 卷2》
《面向模式的软件架构 卷4》
《图说设计模式》
Posted by: 大CC | 27APR,2015
博客:blog.me115.com [订阅]
微博:新浪微博
相关推荐
两种高性能IO设计模式(Reactor和Proactor)比较 在高性能服务器设计中,I/O设计模式扮演着至关重要的角色。常见的I/O设计模式有阻塞型、非阻塞同步型和非阻塞异步型。其中,非阻塞异步型I/O设计模式是性能最高、...
《两种高性能IO设计模式(Reactor/Proactor)的比较》 在构建高性能TCP服务器时,I/O设计模式的选择至关重要,因为它们直接影响系统的性能和可扩展性。本文主要对比了两种主要的I/O多路复用模式:Reactor和Proactor...
Reactor和Proactor是两种高性能IO设计模式。Reactor模式是指在IO操作过程中,将所有的IO事件都交给一个事件处理器来处理。Proactor模式是指在IO操作过程中,将所有的IO事件都交给一个事件处理器来处理,然后将结果回...
分析常见高性能网络设计模式,涵盖了reactor, proactor。
(3)IO多路复用(IOMultiplexing):即经典的Reactor设计模式,有时也称为异步阻塞IO,Java中的Selector和Linux中的epoll都是这种模型。(4)异步IO(AsynchronousIO):即经典的Proactor设计模式,也称为异步非...
Reactor模式是一种事件驱动设计模式,用于处理多个并发连接。它通过一个中心调度组件(Reactor)来注册事件处理器,并分发I/O事件到相应的处理器,从而避免了线程池中大量线程等待I/O完成的低效情况。Reactor模式有...
非阻塞的 IO 分成两种,分别是非阻塞同步 IO 和非阻塞异步 IO,对应的,Reactor 和 Proactor 是高性能并发服务器设计中常见的两种模式,Reactor 用于同步 IO,Proactor 用于异步 IO。无论是 Reator 还是 Proactor,...
3. **Reactor模式**:Reactor是Java NIO的基础,它是一种基于事件驱动的设计模式,用于高效地处理多个事件源。Reactor模式的核心思想是定义了线程和事件处理器之间的协作机制,其中线程在事件发生时调用相应的事件...
说起,然后接着阐述了阻塞和非阻塞的区别,接着介绍了阻塞IO和非阻塞IO的区别,然后介绍了同步IO和异步IO的区别,接下来介绍了5种IO模型,后介绍了两种和高性能IO设计相关的设计模式(Reactor和Proactor)。...
在IT行业中,Reactor模式是一种常见的并发编程设计模式,它主要用于处理多个客户端的同步请求。在C++领域,实现Reactor模式可以有效地提高系统性能,特别是在网络编程和多线程应用中。本项目"reactor-demo"显然是一...
- **Reactor模型**:根据事件触发方式又可分为Level-Triggered (LT) 和 Edge-Triggered (ET) 两种类型。LT模式适用于需要监控多个连接的场景,而ET模式更适用于每个连接只发生一次事件的情况。 - **Proactor模型**:...
Reactor模式是Netty中的核心设计模式,它是一种事件驱动的设计模式,用于处理多个并发连接。在Netty中,BossGroup负责接收新的连接请求,WorkerGroup则处理已建立连接的读写事件。这种设计使得Netty可以高效地处理...
总之,处理Socket高并发是一项挑战,涉及到网络协议、操作系统内核、编程语言特性和设计模式等多个方面。通过学习和实践这个资源提供的源码,开发者可以提升在网络编程领域的专业技能,为构建高效、稳定的服务器端...
1. **前摄器(Proactor)模式**:这是 Boost Asio 中的一个核心设计理念,允许程序在 I/O 操作完成后被通知。这与传统的反应器(Reactor)模式不同,后者是在 I/O 准备就绪时被通知。 2. **线程和 Boost Asio**:...
此外,为了进一步提升性能,服务框架可能会采用非阻塞IO(如epoll或kqueue)和事件驱动模型(如Reactor或Proactor模式)。这些技术使得服务器可以在等待IO操作完成时执行其他任务,极大地提高了系统吞吐量。 在C++...
在高并发架构中,常见的 IO 模型包括 Reactor 和 Proactor 模型,以及多路复用技术如 select、poll 和 epoll。Reactor 模型(如 Nginx 所采用)是事件驱动的,而 Proactor 模型(如 Netty)则是异步完成的。多路复用...
在设计基于AIO的框架时,通常可以参考反应器(Reactor)模式。在异步I/O中,有一个相应的模式称为预处理器(Proactor)模式。与Reactor不同,Proactor模式不关注事件的注册和选择,而是专注于异步操作的处理。在AIO...
5. **事件驱动编程**:为了提高效率,聊天程序可能采用异步事件驱动模型,如Reactor或Proactor模式。`boost.asio`提供了很好的支持,允许在一个线程中处理多个I/O事件。 6. **数据结构**:消息队列、用户列表等数据...