C++从0实现百万并发Reactor服务器[完结13章]

双寿
• 阅读 87

参考资料地址1:https://pan.baidu.com/s/19N2Dw56-c4EMeu3s7hIaTQ 提取码: sjym 参考资料地址2:https://share.weiyun.com/yAMzj8N9 密码:viangd

Reactor 模式也叫做反应器设计模式,它是一种为处理服务请求并发提交到一个或者多个服务处理程序的事件设计模式。当请求抵达后,服务处理程序使用解多路分配策略,然后同步地派发这些请求至相关的请求处理程序。

Reactor翻译过来的意思是:反应堆,所以Reactor设计模式本质是基于事件驱动的。在Reactor设计模式中,存在如下几个角色。

Handle(事件)。Reactor整体是基于Handle进行驱动,这里的Handle叫做事件,可以类比为BIO中的Socket,NIO中的Socket管道。比如当Socket管道有连接建立,或者有数据可读,那么此时就称作事件发生;

EventHandler(事件处理器)。有事件发生,就需要有相应的组件来处理事件,那么这里的组件就叫做事件处理器。EventHandler是一个抽象概念,其会有不同的具体实现,因为事件会有不同的类型,那么不同类型的事件,肯定都需要有相应的具体处理逻辑,这里的具体处理逻辑,就由EventHandler的具体实现来承载;

Concrete Event Handler(具体事件处理器)。是EventHandler的具体实现,用于处理不同类型的事件;

Synchronous Event Demultiplexer(事件多路分解器)。(这里将Synchronous Event Demultiplexer简称为Demultiplexer)Demultiplexer用于监听事件并得到所有发生事件的集合,在监听的状态下是阻塞的,直到有事件发生为止。Demultiplexer有一个很好的类比,就是NIO中的多路复用器Selector,当调用Selector的select() 方法后,会进入监听状态,当从select() 方法返回时,会得到SelectionKey的一个集合,而每一个SelectionKey中就保存着有事件发生的Socket管道;

Initiation Dispatcher(事件分发器)。现在已经有Concrete Event Handler(具体事件处理器)来处理不同的事件,也能通过Synchronous Event Demultiplexer(事件多路分解器)拿到发生的事件,那么最后需要做的事情,肯定就是将事件分发到正确的事件处理器上进行处理,而Initiation Dispatcher就是完成这个分发的事情。

对于Reactor模式来说,他并没队列,每当有一个 Event 输入到 Server端时,Service Handler 会将其转发(dispatch)相对应的handler进行处理。

Reactor的组件主要包括三个: Reactor:派发器,将 client端的事件分发给相对应的Handler Acceptor:请求连接器,Reactor 接收到 client 连接事件后,会将其转发给 Acceptor,Acceptor 则会接受 Client 的连接,建立对应的Handler,并向 Reactor注册此Handler Handler:请求处理器,负责事件的处理。

介绍一下 Proactor 模式的工作流程: Proactor Initiator 负责创建 Proactor 和 Handler 对象,并将 Proactor 和 Handler 都通过 Asynchronous Operation Processor 注册到内核; Asynchronous Operation Processor 负责处理注册请求,并处理 I/O 操作;Asynchronous Operation Processor 完成 I/O 操作后通知 Proactor; Proactor 根据不同的事件类型回调不同的 Handler 进行业务处理; Handler 完成业务处理;

在EmosWxApiApplication.java文件中创建init()方法,读取常量数据并缓存 @SpringBootApplication @ServletComponentScan @Slf4j public class EmosWxApiApplication { @Autowired private SysConfigDao sysConfigDao;

@Autowired
private SystemConstants constants;

public static void main(String[] args) {
    SpringApplication.run(EmosWxApiApplication.class, args);
}

@PostConstruct
public void init() {
    List<SysConfig> list = sysConfigDao.selectAllParam();
    list.forEach(one -> {
        String key = one.getParamKey();
        key = StrUtil.toCamelCase(key);
        String value = one.getParamValue();
        try {
            Field field = constants.getClass().getDeclaredField(key);
            field.set(constants, value);
        } catch (Exception e) {
            log.error("执行异常", e);
        }
    });

}

} 因为查询当月数据,以及查询某月数据,都要提交Ajax请求,所以不如把这部分代码封装起来,然后再调用更加省事。 searchCheckin: function(ref, year, month) { let that = ref; that.sum_1 = 0; that.sum_2 = 0; that.sum_3 = 0; that.list.length = 0; that.ajax(that.url.searchMonthCheckin, 'POST', { year: year, month: month }, function(resp) { for (let one of resp.data.list) { if (one.status!=null && one.status != '') { let color = ''; if (one.status == '正常') { color = 'green'; } else if (one.status == '迟到') { color = 'orange'; } else if (one.status == '缺勤') { color = 'red'; } that.list.push({ date: one.date, info: one.status, color: color }); } } that.sum_1 = resp.data.sum_1; that.sum_2 = resp.data.sum_2; that.sum_3 = resp.data.sum_3; }); }

点赞
收藏
评论区
推荐文章
荀勗 荀勗
4个月前
首个基于Transformer的分割检测+视觉大模型视频课程(附源码+课件)
参考资料地址1:https://pan.baidu.com/s/14g2VTg8JeeZ0pDey7xwGg提取码:2bmp参考资料地址2:https://share.weiyun.com/tnVNHGMD密码:3fj7iy众所周知,视觉系统对于理解和推理
荀勗 荀勗
4个月前
高性能多级网关与多级缓存架构落地实战(完结+附电子书)
参考资料地址1:https://pan.baidu.com/s/12w0TT26aywnoIcogPg8Uw提取码:uzf4参考资料地址2:https://share.weiyun.com/SNltUNLW密码:zi3dc7什么是网关?网关(Gateway
荀勗 荀勗
4个月前
[新版16章+电子书]SpringBoot+Vue3 项目实战,打造企业级在线办公系统
参考资料地址1:https://pan.baidu.com/s/1KmJP0OPD5P6iHlT7G1MIw提取码:4wyi参考资料地址2:https://share.weiyun.com/jVSDdcBU密码:cruqf9一个完整的在线办公系统具备哪些功
吉太 吉太
4个月前
[2023新版16章]SpringBoot+Vue3 项目实战,打造企业级在线办公系统
参考资料地址1:https://pan.baidu.com/s/1ZJGS0SA9pIUr76VUXioNSg提取码:95bd参考资料地址2:https://share.weiyun.com/jVSDdcBU密码:cruqf9SpringBootVue3
赵嬷嬷 赵嬷嬷
3个月前
[完结10章]Vue3+Pinia+Vite+TS 还原高性能外卖APP项目
参考资料地址1:https://pan.baidu.com/s/1u0uNBMkOA2NRk3N6myb4Zg提取码:tnlt参考资料地址2:https://share.weiyun.com/Wjw3QpeQ密码:gxrfcwVue3带来的改变,除了其自身
双寿 双寿
3个月前
大模型之最火Agent实战(打造你代理)教程
参考资料地址1:https://pan.baidu.com/s/1ymxhyeFjJX8DY3VeYJohg提取码:7k1q参考资料地址2:https://share.weiyun.com/olW8Mzf0密码:6bag56代理(Agent)指能自主感知环
双寿 双寿
3个月前
慕课甄选-2024年Flutter零基础极速入门到进阶实战[16章]
参考资料地址1:https://pan.baidu.com/s/1j35W30a7JQAGTV2rYgxRNA提取码:5o3h参考资料地址2:https://pan.baidu.com/s/1Iwj10AL7jdum19WQz1jdA提取码:0n8xFlu
吉太 吉太
2个月前
C++从0实现百万并发Reactor服务器[完结13章]
参考资料地址1:https://pan.baidu.com/s/10hWsc5kaC1uQGQpMsZsw提取码:xn6a参考资料地址2:https://share.weiyun.com/yAMzj8N9密码:viangd一、reactor是什么?怎么理解
双寿 双寿
1个月前
实战Flink+Doris实时数仓教程
参考资料1:https://pan.baidu.com/s/1KoaLsoYaB4JMFAI0aDyXg提取码:pr5c参考资料2:https://share.weiyun.com/OL2DSs1X密码:srevyt一、什么是实时数仓实时数据仓库(Real
双寿 双寿
3星期前
慕课甄选-2024年Flutter零基础极速入门到进阶实战【完结17章】
参考资料1:https://pan.baidu.com/s/1pD7WhaO5FbbGsu0t3sAw提取码:wv6m参考资料2:https://share.weiyun.com/mDuF95rR密码:c7r3ec一、Flutter基础概念Flutter框