web serveer

Web Server (网页服务器)

一个网络服务器就是一个服务器软件(程序),或者是运行这个服务器软件的硬件(计算机)。其主要功能是通过HTTP协议与客户端(通常是浏览器(浏览器)进行通信,来接收,存储,处理来自客户端的HTTP请求并对其请求做出HTTP响应,返回给客户端其请求的内容(文件、网页等)或返回一个错误信息。
在这里插入图片描述

通常用户使用浏览器与相应服务器进行通信.在浏览器中键入“域名”或“IP地址:端口号”,浏览器则先将你的域名解析成相应的IP地址或者直接根据你的IP地址向对应的Web服务器发送一个HTTP请求。这一过程首先要通过tcp协议的三次握手建立与目标协议的三次握手建立与目标服务器的连接,然后HTTP协议生成针对目标协议生成针对目标服务器的HTTP请求报文,通过tcp、IP等协议发送到目标Web服务器上。

HTTP请求报文格式

在这里插入图片描述

HTTP请求报文格式

在这里插入图片描述

Reactor模式

要求主线程(I/O处理单元)只负责监听文件描江符上是否有事件发生,有的话就立即将该事件通知工作线程(逻辑单元),将Socket可读可写事件放入请求队列,交给工作线程处理.除此之外,主线程不做任何其他实质性的
工作.读写数据,接受新的连接,以及处理客户请求均在工作线程中完成.
使用同步I/O模拟(以epoll_wait为例)实现的反应器模式的工作流程是:
1.主线程往epoll内核事件表中注册套接字上的读就绪事件.
2.主线程调用epoll_wait等待wocket上有数据可读.
3.当套接字上有数据可读时,epoll_wait通知主线程。主线程则将Socket可读事件放入请求队列.
4.睡眠在请求队列上的某个工作线程被唤醒,它从Socket读取数据,并处理客户请求,然后往EPOLL内核事件表中注册该Socket上的写就绪事件.
5.当主线程调用epoll_wait等待Socket可写
6.当套接字可写时,epoll_wait通知主线程。主线程将Socket可写事件放入请求队列.
7.睡眠在请求队列上的某个工作线程被唤醒,它往Socket上写入服务器处理客户请求的结果.

在这里插入图片描述

线程池

线程池是由服务器预先创建的一组子线程,线程池中的线程数量应该和cpu数量差不多.线程池中的所有子线程都运行着相同的代码.当有新的任务到来时,主线程将通过某种方式选择线程池中的某一个子线程来为之服务.相
比与动态的创建子线程,选择一个已经存在的子线程的代价显然要小得多.至于主线程选择哪个子线程来为新任务服务,则有多种方式:

主线程使用某种算法来主动选择子线程.最简单、最常用的算法是随机算法和RoundRobin(轮流选取)算)法,但更优秀、更智能的算法将使任务在各个工作线程中更均匀地分配,从而减轻服务器的整体压力.主线程和所有子线程通过一个共享的工作队列来同步,子线程都睡眠在该工作队列上.当有新的任务到来时,
主线程将任务添加到工作队列中.这将唤醒正在等待任务的子线程,不过只有一个子线程将获得新任务的“接管权“,它可以从工作队列中取出任务并执行之,而其他子线程将继续睡眠在工作队列上.

线程池的一般模型为:
在这里插入图片描述

1.单例模式 初始化日志系统 单独调度线程
2.创建线程池,信号量进行线程的锁定
3.创建套接字,绑定ip地址和端口号,监听套接字
4.创建epoll模型,创建事件,将监听套接字epoll_ctl加入epoll
5.epoll_wait 等待事件触发,遍历事件数组,查询如果触发事件为监听fd 则开始接受接受,并重新创建一个connfd 用于收发数据 并加入epoll中 等待是否有事件到来 用connfd作为下标放入http_conn类型数组,用于定位该请求
6.读取数据 放入 所对应请求的m_read_buf中 加入事件到工作队列中,触发信号 释放线程池中的一个线程 用于执行
7.解析http请求,读取一行,判断请求行 请求头 请求体,状态机 进行解析 读取客户端请求 解析到类内部各个成员
8.根据解析请求 返回状态 发送给客户端 对应的资源 或者提示的结果

由于非活跃连接占用了连接资源,严重影响服务器的性能,通过实现一个服务器定时器,处理这种非活跃连接,释放连接资源。利用alarm函数周期性地触发SIGALRM信号,该信号的信号处理函数利用管道通知主循环执行定时器链表上的定时任务.
将管道的fd加入epoll 一旦有sigalrm信号发送,epoll_wait就会收到 然后执行链表定时任务tick();

统一事件源
基于升序链表的定时器
处理非活动连接

压测
20000客户端 5秒 效果不太行。。。
在这里插入图片描述

项目地址

### RabbitMQ Server 与 RabbitMQ-server.bat 的区别 `rabbitmq-server` 是 RabbitMQ 消息队列的核心服务程序名称,而 `rabbitmq-server.bat` 则是一个用于在 Windows 平台上启动 RabbitMQ 服务的批处理脚本文件。 #### 1. **RabbitMQ-server** 这是 RabbitMQ 主进程的实际可执行文件,在 Linux 或其他类 Unix 系统中通常位于 `/usr/sbin/rabbitmq-server` 路径下。它负责运行 RabbitMQ 服务器的主要功能,包括消息传递、队列管理以及与其他组件(如插件)交互的功能[^3]。 - 在 Linux 上通过命令行直接调用时,可以附加参数来控制其行为,例如调试模式或指定配置文件位置。 - 启动方式通常是通过 systemctl 命令或者手动执行该二进制文件完成服务初始化过程。 #### 2. **RabbitMQ-server.bat** 此 `.bat` 文件专为 Microsoft Windows 设计并提供给用户作为便捷工具使用的一部分[^2]。它的主要作用是以更友好的形式封装了复杂的底层逻辑以便于开发者轻松地管理和操作 RabbitMQ 实例: - 当用户双击这个批处理文件或将之纳入自动化流程当中时,实际上会间接触发 Erlang VM 来加载真正的核心应用程序——即前述提到过的 rabbitmq_server 应用本身; - 此外还包含了针对特定平台所做的额外设置调整工作比如环境变量定义等必要准备工作; 因此可以说两者之间存在紧密联系却又各自承担不同职责范围内的任务角色划分情况如下表所示: | 属性 | rabbitmq-server | rabbitmq-server.bat | |--------------------|------------------------------------------|-----------------------------------------| | **操作系统支持** | 主要面向Linux及其他Unix-like系统 | 针对Windows设计 | | **本质属性** | 可执行的服务入口 | 批处理脚本 | | **用途描述** | 启动和维护RabbitMQ服务 | 提供简单接口以简化跨平台兼容性的实现 | 综上所述,虽然它们的名字非常相似甚至容易混淆但实际上分别适用于不同的场景需求并且有着明确分工界限. ```batch @echo off setlocal enabledelayedexpansion rem Example content of rabbitmq-server.bat might look like this: call "%~dp0erl.exe" -boot start_clean ... ``` 以上展示了如何利用 batch scripting 技术构建起围绕 erlang runtime environment 构建起来的应用生态系统的一个侧面视角而已!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值