博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[JAVA学习笔记-69]Reactor与Proactor模式
阅读量:4098 次
发布时间:2019-05-25

本文共 1708 字,大约阅读时间需要 5 分钟。

Reactor模式:

这里写图片描述
Reactor包含如下角色:
• Handle 句柄;用来标识socket连接或是打开文件;
• Synchronous Event Demultiplexer:同步事件多路分解器:由操作系统内核实现的一个函数;用于阻塞等待发生在句柄集合上的一个或多个事件;(如select/epoll;)
• Event Handler:事件处理接口
• Concrete Event HandlerA:实现应用程序所提供的特定事件处理逻辑;
• Reactor:反应器,定义一个接口,实现以下功能:
1)供应用程序注册和删除关注的事件句柄;
2)运行事件循环;
3)有就绪事件到来时,分发事件到之前注册的回调函数上处理;
这里写图片描述

Proactor模式:

这里写图片描述

这里写图片描述

Proactor主动器模式包含如下角色
• Handle 句柄;用来标识socket连接或是打开文件;
• Asynchronous Operation Processor:异步操作处理器;负责执行异步操作,一般由操作系统内核实现;
• Asynchronous Operation:异步操作
• Completion Event Queue:完成事件队列;异步操作完成的结果放到队列中等待后续使用
• Proactor:主动器;为应用程序进程提供事件循环;从完成事件队列中取出异步操作的结果,分发调用相应的后续处理逻辑;
• Completion Handler:完成事件接口;一般是由回调函数组成的接口;
• Concrete Completion Handler:完成事件处理逻辑;实现接口定义特定的应用处理逻辑;

这里写图片描述

优点

Reactor实现相对简单,对于耗时短的处理场景处理高效;
操作系统可以在多个事件源上等待,并且避免了多线程编程相关的性能开销和编程复杂性;
事件的串行化对应用是透明的,可以顺序的同步执行而不需要加锁;
事务分离:将与应用无关的多路分解和分配机制和与应用相关的回调函数分离开来,
Proactor性能更高,能够处理耗时长的并发场景;
缺点
Reactor处理耗时长的操作会造成事件分发的阻塞,影响到后续事件的处理;
Proactor实现逻辑复杂;依赖操作系统对异步的支持,目前实现了纯异步操作的操作系统少,实现优秀的如windows IOCP,但由于其windows系统用于服务器的局限性,目前应用范围较小;而Unix/Linux系统对纯异步的支持有限,应用事件驱动的主流还是通过select/epoll来实现;
适用场景
Reactor:同时接收多个服务请求,并且依次同步的处理它们的事件驱动程序; Proactor:异步接收和同时处理多个服务请求的事件驱动程序;
Disadvantages
— Program complexity.
It is more difficult to develop applications using asynchronous mechanisms due to the separation in time and space between operation initiation and completion. Applications may also be harder to debug due to the inverted flow of control.
— Memory usage.
Buffer space must be committed for the duration of a read or write operation, which may continue indefinitely, and a separate buffer is required for each concurrent operation. The Reactor pattern, on the other hand, does not require buffer space until a socket is ready for reading or writing

你可能感兴趣的文章
c++输入文件流ifstream用法详解
查看>>
c++输出文件流ofstream用法详解
查看>>
字符编码:ASCII,Unicode 和 UTF-8
查看>>
QT跨MinGW和MSVC两种编译器的解决办法
查看>>
firewalld的基本使用
查看>>
Linux下SVN客户端使用教程
查看>>
i2c-tools
查看>>
Linux分区方案
查看>>
nc 命令详解
查看>>
如何使用 systemd 中的定时器
查看>>
git命令速查表
查看>>
linux进程监控和自动重启的简单实现
查看>>
OpenFeign学习(三):OpenFeign配置生成代理对象
查看>>
OpenFeign学习(四):OpenFeign的方法同步请求执行
查看>>
OpenFeign学习(五):OpenFeign请求结果处理及重试控制
查看>>
OpenFeign学习(六):OpenFign进行表单提交参数或传输文件
查看>>
OpenFeign学习(七):Spring Cloud OpenFeign的使用
查看>>
Ribbon 学习(二):Spring Cloud Ribbon 加载配置原理
查看>>
Ribbon 学习(三):RestTemplate 请求负载流程解析
查看>>
深入理解HashMap
查看>>