当前位置: 首页 > news >正文

仿muduo库One Thread One Loop式主从Reactor模型实现高并发服务器

通过一段时间的学习,自己想着去实现一个高并发的服务器组件,目前暂时先不关注实际的业务内容。
目前希望通过自己实现的高并发服务器组件,能够简洁快速的完成一个高性能的服务器的搭建;并且,通过组件内提供的不同应用层协议支持,也可以快速完成一个高性能应用服务器的搭建,比如提供HTTP协议组件的支持。

HTTP服务器

概念:

HTTP(Hyper Text Transfer Protocol),超文本传输协议是应用层协议,是一种简单的请求-响应协议(客户端根据自己的需要向服务器发送请求,服务器针对请求提供服务,完毕后通信结束)。需要注意的是HTTP协议是一个运行在TCP协议之上的应用层协议,从这一点我们可知HTTP服务器其实就是个TCP服务器,只不过在应用层基于HTTP协议格式进行数据的组织和解析来明确客户端的请求并完成业务处理。

因此实现HTTP服务器简单理解,只需要以下几步即可

1、搭建一个TCP服务器,接收客户端请求。
2、以HTTP协议格式进行解析请求数据,明确客户端目的.

3、明确客户端请求目的后提供对应服务。

4、将服务结果以HTTP协议格式进行组织,发送给客户端。

实现一个HTTP服务器很简单,但是实现一个高性能的服务器并不简单,这里将基于Reactor模式的高性能服务器实现。

准确来说,因为我们要实现的服务器本身并不存在业务,咱们要实现的应该算是一个高性能服务器基础库,是一个基础组件。

Reactor模型

概念:

Reactor 模式,是指通过一个或多个输入同时传递给服务器进行请求处理时的事件驱动处理模式。服务端程序处理传入多路请求,并将它们同步分派给请求对应的处理线程,Reactor模式也叫Dispatcher 模式。

简单理解就是使用 I/O多路复用 统一监听事件,收到事件后分发给处理进程或线程,是编写高性能网络服务器的必备技术之一。

分类:

单Reactor单线程:单I/O多路复用+业务处理

1、通过IO多路复用模型进行客户端请求监控
2、触发事件后,进行事件处理
a.如果是新建连接请求,则获取新建连接,并添加至多路复用模型进行事件监控。
b.如果是数据通信请求,则进行对应数据处理(接收数据,处理数据,发送响应)。
优点:所有操作均在同一线程中完成,思想流程较为简单,不涉及进程/线程间通信及资源争抢问题。
缺点:无法有效利用CPU多核资源,很容易达到性能瓶颈。
使用场景:适用于客户端数量较少,且处理速度较为快速的场景。(处理较慢或活跃连接较多,会导致串行处理的情况下,后处理的连接长时间无法得到响应)。

单Reactor多线程:单I/O多路复用+线程池(业务处理)

1、Reactor线程通过I/O多路复用模型进行客户端请求监控
2、触发事件后,进行事件处理
a.如果是新建连接请求,则获取新建连接,并添加至多路复用模型进行事件监控。
b.如果是数据通信请求,则接收数据后分发给Worker线程池进行业务处理。
c.工作线程处理完毕后,将响应交给Reactor线程进行数据响应
优点:充分利用CPU多核资源
缺点:多线程间的数据共享访问控制较为复杂,单个Reactor 承担所有事件的监听和响应,在单线程中运行,高并发场景下容易成为性能瓶颈。

多Reactor多线程:多I/O多路复用+线程池(业务处理)

1、在主Reactor中处理新连接请求事件,有新连接到来则分发到子Reactor中监控
2、在子Reactor中进行客户端通信监控,有事件触发,则接收数据分发给Worker线程池
3、Worker线程池分配独立的线程进行具体的业务处理
a.工作线程处理完毕后,将响应交给子Reactor线程进行数据响应
优点:充分利用CPU多核资源,主从Reactor各司其职。

本篇博客分享了自己实现的一个项目,后续分模块继续更新,欢迎评论交流!

博客链接:https://gitee.com/crocodile-skin-slope/muduohttps://gitee.com/crocodile-skin-slope/muduo

http://www.dtcms.com/a/266840.html

相关文章:

  • RabbitMQ 高级特性之死信队列
  • VS CodeC51 单片机开发环境搭建
  • 猫头虎 AI工具分享:一个网页抓取、结构化数据提取、网页爬取、浏览器自动化操作工具:Hyperbrowser MCP
  • Web前端工程化
  • 网安系列【4】之OWASP与OWASP Top 10:Web安全入门指南
  • 一探 3D 互动展厅的神奇构造​
  • Querybook:一个开源大数据查询分析工具
  • Workflow or 自主智能体?网易CoreAgent如何打造企业级智能体平台新范式
  • OpenSearch添加仪表盘(elastic、es)
  • 全面分析软考《系统分析师》和《系统架构设计师》论文差异
  • go基础语法10问(2)
  • MySQL 事务详解:从基础操作到隔离级别与 MVCC 原理
  • vue3引入海康监控视频组件并实现非分屏需求一个页面同时预览多个监控视频;
  • 本地部署项目文档管理网站 MkDocs 并实现外部访问
  • Centos安装Jenkins
  • ZigBee通信技术全解析:从协议栈到底层实现,全方位解读物联网核心无线技术
  • OpenCV 图像操作:颜色识别、替换与水印添加
  • 传统架构开发VS PREEvision:一场效率与可靠性的降维打击
  • [C/C++内存安全]_[中级]_[如何避免数组访问越界]
  • 【精华】QPS限流等场景,Redis其他数据结构优劣势对比
  • 7.4_面试_JAVA_
  • python学习打卡:DAY 18 推断聚类后簇的类型
  • 在 Vue 3 中全局使用 Suspense 组件
  • 【内存】Linux 内核优化实战 - kernel.numa_balancing
  • [Linux]内核态与用户态详解
  • 1.1_3_2 三种交换方式的性能分析
  • PHP从字符串到数值的类型转换
  • 后端密码加密:守护用户数据的钢铁长城
  • 第三章 基于rtthread标准库的串口和shell应用
  • vue 循环无限滚动表格