001 仿muduo库实现高性能服务器组件_项目简介

2024-05-26 12:28

本文主要是介绍001 仿muduo库实现高性能服务器组件_项目简介,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

​🌈个人主页:Fan_558
🔥 系列专栏:仿muduo
🌹关注我💪🏻带你学更多知识

文章目录

  • 一、项目简介
  • 二、所需知识储备
  • 三、什么是muduo
  • 四、Reactor模式
      • 单Reactor单线程:单I/O多路复⽤+业务处理
      • 单Reactor多线程:单I/O多路复⽤+线程池(业务处理)
      • 多Reactor多线程:多I/O多路复⽤+线程池(业务处理)

一、项目简介

我们知道通过socket可以实现一个简单的tcp服务器,可以进行简单的通信,但是如果有很多的客户端同时进行请求,那么很明显效率不高,该项目目标就是设计出是⼀个⾼并发服务器组件,可以简洁快速的完成一个高性能的服务器搭建,在此服务器的基础上,使用者可以添加各种应用层协议,由此实现多种功能的服务器,例如:HTTP服务器、FTP服务器、SSH服务器…
本项目则实现较为常见的HTTP服务器,即搭建出服务器组件后,只需要在应用层添加HTTP协议支持,便可完成一个服务器的搭建。
本项目核心集中在实现高并发高性能服务器组件(80%),通过该组件的设计可以学到Reactor的事件驱动处理模式的设计思想,其次20%在应用层协议支持上。
本项目服务器组件的设计代码量在1300行左右,HTTP协议支持代码量在600行左右,另外的本项目不包含任何的业务逻辑,具体要让服务器进行怎样的业务逻辑处理,得看组件使用者,组件使用者也只需要添加业务逻辑处理的接口即可。

二、所需知识储备

Linux:多线程、网络套接字编程、多路转接技术(epoll)、网络协议了解
C++:类和对象、多态、继承。一些C++11以及C++17的新特性:比如function、bind、智能指针(shared_ptr、weak_ptr)、mutex、regex正则表达式、any。

三、什么是muduo

Muduo 是一个用于 Linux 多线程服务器的 C++ 非阻塞网络库,由陈硕所写。它主要设计用于需要高性能网络通信的服务器端应用程序,特别适合于构建高并发的在线服务和分布式系统。Muduo 的设计哲学强调简单、高效和可靠,它提供了一套丰富的 API 来简化网络编程的复杂性,同时保持高性能。

四、Reactor模式

Reactor 模式是一种事件处理的设计模式,用于异步IO。这种模式通过将请求处理分配给不同的处理器来响应并处理IO事件,特别适用于高并发环境下的网络服务器。Reactor 模式能有效地管理和处理大量并发输入/输出操作,减少系统资源消耗,提高应用性能。
简单理解就是使用 io多路复用统⼀监听事件,收到事件后分发给处理进程或线程,是编写高性能网络服务器的必备技术之一。
Reactor模型可以分为三种类型:① 单Reactor单线程,② 单Reactor多线程,③ 多Reactor多线程。

单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各司其职

在这里插入图片描述

项目定位

该项目要实现的是主从Reactor模型服务器,也就是主Reactor线程仅仅监控监听描述符,获取新建连接,保证获取新连接的⾼效性,提⾼服务器的并发性能。

主Reactor获取到新连接后分发给⼦Reactor进⾏通信事件监控。⽽⼦Reactor线程监控各⾃的描述符的读写事件进⾏数据读写以及业务处理。

One Thread One Loop的思想就是把所有的操作都放到⼀个线程中进⾏,⼀个线程对应⼀个事件处理的循环。

当前实现中,因为并不确定组件使⽤者的使⽤意向,因此并不提供业务层⼯作线程池的实现,只实现主从Reactor,⽽Worker⼯作线程池,可由组件库的使⽤者的需要⾃⾏决定是否使⽤和实现。
因此此项目真正要实现的是如下结构
在这里插入图片描述

这篇关于001 仿muduo库实现高性能服务器组件_项目简介的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1004460

相关文章

Python实现终端清屏的几种方式详解

《Python实现终端清屏的几种方式详解》在使用Python进行终端交互式编程时,我们经常需要清空当前终端屏幕的内容,本文为大家整理了几种常见的实现方法,有需要的小伙伴可以参考下... 目录方法一:使用 `os` 模块调用系统命令方法二:使用 `subprocess` 模块执行命令方法三:打印多个换行符模拟

SpringBoot+EasyPOI轻松实现Excel和Word导出PDF

《SpringBoot+EasyPOI轻松实现Excel和Word导出PDF》在企业级开发中,将Excel和Word文档导出为PDF是常见需求,本文将结合​​EasyPOI和​​Aspose系列工具实... 目录一、环境准备与依赖配置1.1 方案选型1.2 依赖配置(商业库方案)二、Excel 导出 PDF

Python实现MQTT通信的示例代码

《Python实现MQTT通信的示例代码》本文主要介绍了Python实现MQTT通信的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 安装paho-mqtt库‌2. 搭建MQTT代理服务器(Broker)‌‌3. pytho

SpringBoot改造MCP服务器的详细说明(StreamableHTTP 类型)

《SpringBoot改造MCP服务器的详细说明(StreamableHTTP类型)》本文介绍了SpringBoot如何实现MCPStreamableHTTP服务器,并且使用CherryStudio... 目录SpringBoot改造MCP服务器(StreamableHTTP)1 项目说明2 使用说明2.1

使用zip4j实现Java中的ZIP文件加密压缩的操作方法

《使用zip4j实现Java中的ZIP文件加密压缩的操作方法》本文介绍如何通过Maven集成zip4j1.3.2库创建带密码保护的ZIP文件,涵盖依赖配置、代码示例及加密原理,确保数据安全性,感兴趣的... 目录1. zip4j库介绍和版本1.1 zip4j库概述1.2 zip4j的版本演变1.3 zip4

python生成随机唯一id的几种实现方法

《python生成随机唯一id的几种实现方法》在Python中生成随机唯一ID有多种方法,根据不同的需求场景可以选择最适合的方案,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习... 目录方法 1:使用 UUID 模块(推荐)方法 2:使用 Secrets 模块(安全敏感场景)方法

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命

Spring Boot 结合 WxJava 实现文章上传微信公众号草稿箱与群发

《SpringBoot结合WxJava实现文章上传微信公众号草稿箱与群发》本文将详细介绍如何使用SpringBoot框架结合WxJava开发工具包,实现文章上传到微信公众号草稿箱以及群发功能,... 目录一、项目环境准备1.1 开发环境1.2 微信公众号准备二、Spring Boot 项目搭建2.1 创建

IntelliJ IDEA2025创建SpringBoot项目的实现步骤

《IntelliJIDEA2025创建SpringBoot项目的实现步骤》本文主要介绍了IntelliJIDEA2025创建SpringBoot项目的实现步骤,文中通过示例代码介绍的非常详细,对大家... 目录一、创建 Spring Boot 项目1. 新建项目2. 基础配置3. 选择依赖4. 生成项目5.

Linux下删除乱码文件和目录的实现方式

《Linux下删除乱码文件和目录的实现方式》:本文主要介绍Linux下删除乱码文件和目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下删除乱码文件和目录方法1方法2总结Linux下删除乱码文件和目录方法1使用ls -i命令找到文件或目录