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

吉太
• 阅读 113

参考资料地址1:https://pan.baidu.com/s/10hWsc5kaC-1uQGQ_pMsZsw 提取码: xn6a 参考资料地址2:https://share.weiyun.com/yAMzj8N9 密码:viangd

一、reactor是什么?怎么理解? reactor是一种设计模式, 是服务器的重要模型, 是一种事件驱动的反应堆模式, 高效的事件处理模型。

reactor 反应堆: 事件来了才执行,事件类型可能不尽相同,所以我们需要提前注册好不同的事件处理函数。事件到来就由 epoll_wait 获取同时到来的多个事件,并且根据数据的不同类型将事件分发给事件处理机制 (事件处理器), 也就是提前注册的哪些接口函数。

reactor模型的设计思想和思维方式:它需要的是事件驱动,相应的事件发生,根据事件自动的调用相应的函数,所以需要提前注册好处理函数的接口到reactor中, 函数是由reactor去调用的,而不是再主函数中直接进行调用的, 需要使用回调函数。

reactor中的 IO 使用的是select poll epoll 多路复用IO, 以便提高 IO 事件的处理能力,提高IO事件处理效率,支持更高的并发 。

二、Reactor 模型有三个重要的组件: 多路复用器:由操作系统提供,在 linux 上一般是 select, poll, epoll 等系统调用。 事件分发器:将多路复用器中返回的就绪事件分到对应的处理函数中。 事件处理器:负责处理特定事件的处理函数。

三、Reactor的优点 响应快,不必为单个同步时间所阻塞,虽然 Reactor 本身依然是同步的; 编程相对简单,可以最大程度的避免复杂的多线程及同步问题,并且避免了多线程/进程的切换开销; 可扩展性,可以方便的通过增加 Reactor实例个数来充分利用 CPU 资源; 可复用性,reactor 框架本身与具体事件处理逻辑无关,具有很高的复用性

四、标准/典型的Reactor:

  • 步骤1:等待事件到来(Reactor负责)

  • 步骤2:将读就绪事件分发给用户定义的处理器(Reactor负责)

  • 步骤3:读数据(用户处理器负责)

  • 步骤4:处理数据(用户处理器负责)

改进实现的模拟Proactor:

  • 步骤1:等待事件到来(Proactor负责)

  • 步骤2:得到读就绪事件,执行读数据(现在由Proactor负责)

  • 步骤3:将读完成事件分发给用户处理器(Proactor负责)

  • 步骤4:处理数据(用户处理器负责)

五、客户端代码 //Bind,Connect Socket client = new Socket("127.0.0.1",7777);
//读写 PrintWriter pw = new PrintWriter(client.getOutputStream()); BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
pw.write(br.readLine());
//Close pw.close();
br.close();

服务端代码 Socket socket;
//Bind,Listen ServerSocket ss = new ServerSocket(7777);
while (true) {
//Accept socket = ss.accept();
//一般新建一个线程执行读写 BufferedReader br = new BufferedReader( new InputStreamReader(socket .getInputStream()));
System.out.println("you input is : " + br.readLine());
}

六、单reactor多线程 监听事件,建立连接的流程与单线程一致,在handler处理时有差别。handler只负责读写数据,而业务处理交由其他工作线程处理。一种实现办法是handler在读到数据后发送到工作线程的消息队列,工作线程会不断的读取消息队列中的数据然后处理,处理结束结果返回handler,之后通过send发送。

七、多reactor多线程 多reactor模式一般设置主从reactor, 主reactor只关注listenfd,监听建立连接的事件, 然后交给accpeter处理。连接建立后,读写事件的监控交给子reactor负责,子reactor和对应handler在同一线程,有新的读写事件发生交给对应handler处理来完成对应业务。

八、普通套接字读取:Recver 一直读取,直到错误或者读取完毕;每次读取的结果都放到接受缓冲区; 读取完毕,对接受缓冲区处理,拿出一个个完整的报文,对请求报文进行业务处理; void Recver(Connection *con) { con->_times = time(nullptr); const int buff_size = 1024; char buff[buff_size]; while(true) { ssize_t s = recv(con->_fd, buff, buff_size - 1, 0); if(s > 0) { buff[s] = 0; con->_outbuff += buff; } else if(s == 0) { LOG2(INFO, "写端关闭", con->_fd); con->_exception(con); return; } else { //读取完毕 if(errno == EAGAIN || errno == EWOULDBLOCK ) { LOG2(INFO, "处理完毕", con->_fd); break; } else if(errno == EINTR) continue; else { LOG2(ERROR, "recv fail ,fd: ", con->_fd); con->_exception(con); return; } } } std::cout << "fd: " << con->_fd << "outbuff: " << con->_outbuff <<std::endl; //对outbuff内的完整报文,进行处理 std::vectorstd::string out; //分隔报文,函数在protocol.hpp SplitMessage(out, con->_outbuff); for(auto &s : out) _cb(s, con);//业务逻辑回调指针,在主函数

}
点赞
收藏
评论区
推荐文章
荀勗 荀勗
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/19N2Dw56c4EMeu3s7hIaTQ提取码:sjym参考资料地址2:https://share.weiyun.com/yAMzj8N9密码:viangdReactor模式也叫做反应器设
乐和 乐和
4星期前
C++从0实现百万并发Reactor服务器(网盘超清完结)
C从0实现百万并发Reactor服务器(网盘超清完结)download》chaoxingit.com/4976/为什么要学C从0实现百万并发Reactor服务器学习C并从零开始实现百万并发Reactor服务器具有以下几个重要的原因:深入理解网络
光之守卫 光之守卫
1星期前
C++从0实现百万并发Reactor服务器
C从0实现百万并发Reactor服务器download》quangneng.com/4979/一、C从0实现百万并发Reactor服务器实现一个百万并发的Reactor服务器是一个非常复杂的任务,需要深入了解C、网络编程、并发编程以及操作系统等