基于主从Reactor模型的高性能网络通信框架系列(一):项目框架设计及概述、学习路径

该项目是基于陈硕的Muduo库 进行仿写以及优化,基于Linux系统、C++、网络编程

该项目的代码仓:

git clone https://gitee.com/chang-jj/Reactor-Network-Communication-Framework.git

代码也在持续更新中......

学习阶段

1.高性能服务器框架 TCP

2.支持应用层协议:HTTP

3通过自定制协议 实现RPC(Remote Procedure Call)通信框架

  • 协议----->网络通信中客户端和服务器端之间的数据格式约定

  • 知名协议

  • 自定制协议------>自定义数据格式约定

  • RPC

框架设计

1.Reactor模型

  • 反应堆模型(直译),事件驱动模型(原理),事件循环模型(实现机制)

  • epoll+事件分发

2.核心特性

  • 被动反应:不像主动轮询,而是等待事件发生然后反应

  • 链式反应:一个事件可能触发一系列的后续处理

  • 能量集中:少量线程处理大量连接,像反应堆高效产生能量

  • 控制中心:像核反应堆的控制系统统一调度所有事件

3.reactor网络通信模型的演化

单reactor模型

单线程处理达到性能瓶颈

单reactor+线程池模型

单线程------>epoll监听多个文件描述符

  • 数据的收发------>性能瓶颈

业务处理模块----->线程池处理

主从Reactor

4.与其他相关模型的对比

模型 Reactor(反应堆模型) Proactor(前摄器模型)
IO 类型 同步 IO,事件就绪处理 异步 IO,操作完回调
read/write 应用做 内核做
通知时机 可读/可写 IO完成
epoll Reactor 不是真异步
Windows IOCP
Proactor模型:
  • 前摄器模型,主动模式

  • 核心思想:

    • 应用程序发起异步I/O操作,然后继续执行其他任务,当I/O操作完成时,操作系统会通知应用程序,应用程序再处理相应的业务逻辑

      • Reactor:"当I/O就绪通知我,我来读写操作"

      • Proactor:"我告诉你我要读什么,你帮我做完后通知我结果"'

  • 核心特点:

    • 异步IO:应用程序调用异步IO操作,由操作系统负责执行I/O,应用程序不阻塞等待

    • 完成通知:I/O操作完成后,操作系统主动通知应用程序

    • 分离关注点:应用程序的I/O操作和事件分离,由操作系统负责I/O操作,应用程序负责业务处理

I/O操作:
  • 发起IO调用

  • 等待IO就绪

  • 拷贝数据(内核数据拷贝到buff)

  • IO调用返回

同步和异步区别
  • 事情由谁执行

  • 结果获取方式

    • 同步:主动等待结果

    • 异步:结果完成后被通知

      • 异步IO:进程发起IO调用,IO调用+数据拷贝过程系统完成,IO完成后通知进程
CPU_Kernel

概要设计

模块设计

  • reactor :负责事件循环监控及分发功能。

    • Poller描述符监控模块:封装epoll,负责描述符的事件监控与事件分发。

    • Eventloop事件循环模块 :负责实现Poller事件循环监控+任务池实现连接的线程安全操作。

    • LoopThread模块:负责实现Eventloop与对应线程thread封装在⼀起。

      • 单一职责原则------>一个类只负责一个功能

      • Weakup事件循环唤醒模块:负责Poller的阻塞唤醒事件描述符的读事件处理(muduo中没

      有)

    • LoopThreadPool模块:负责实现池化LoopThread功能。

  • handler :负责描述符的监控事件描述以及事件处理

    • Channel事件处理器模块:负责描述描述符的监控事件以及事件处理

    • TimerQueue定时器模块:负责实现定时器中定时器描述符的读事件处理

      • Timestamp时间操作模块:负责简单的系统⽇期时间操作

      • Timer定时任务模块:负责描述⼀个定时任务(过期时间,是否重复,过期回调,...)

      • TimerId模块:与定时任务Timer对应的定时任务ID(唯⼀序号,定时任务指针)

    • Acceptor监听对象模块:负责监听套接字的读事件处理

    • **Connection连接对象模块:**负责I/O套接字的读写事件处理。

      • Buffer模块:负责实现发送/接收数据缓冲区

      • Sockets模块:负责套接字的各项基础操作

  • 逻辑整合:

    • TcpServer服务器模块:负责基于以上模块整合实现服务端

    • TcpClient客⼾端模块:负责基于以上模块整合实现客⼾端

关系图: