4.网络设计与redis、memcached、nginx组件(二)

系列文章目录

第四章 网络设计与redis、memcached、nginx组件(一)
第五章 网络设计与redis、memcached、nginx组件(二)


文章目录

  • 系列文章目录
    • @[TOC](文章目录)
  • 前言
  • 一、reactor模型?
  • 二、Reactor 开发
    • 1.建立连接
  • 三、典型reactor 模型
    • 单reactor 模型
    • 典型 readis
      • radis 中优化
    • 多reactor 模型 多线程(one eventloop per thread)
    • 典型 memcached
      • 为什么支持多线程 多reactor
    • 多reactor 模型 多进程 (one eventloop per process)
    • 典型引用 nginx
    • nginx流程
  • 总结

前言

此文章主要是是介绍一下reactor 模型和典型的reactor模型开源软件介绍分析。


一、reactor模型?

Reactor 模型的核心就是把对网络IO的处理转变成对事件的处理。 把网络IO检测功能交由IO多路复用(epoll  select poll)实现检测fd 状态,针对时间的处理进行IO操作,不同职能事件通过不同的事件函数处理。

IO多路复用的主要功能是检测多条链路的状态(可读 可写 错误 断开等),但不具备具体IO操作的功能(比如读写数据)。IO多路复用都是同步网络IO ,常见的IO多路复用器有select、poll,epoll,他们是对IO的管理,检测接入的IO,触发IO事件;注意这三个都是同步IO。

在这里插入图片描述

之所以把IO就绪检测的功能交由IO多路复用器,是因为对于服务端而言,某一时刻只有少量的连接有数据交互,如果让IO函数自己检测,在阻塞IO时,每个连接都需要一个线程;非阻塞IO时,每个连接都需要通过while在应用层进行检测。

二、Reactor 开发

1.建立连接

代码如下(示例):

//1.服务端作为被动建立连接
// listenfd 注册监听listenfd 的事件
struct epoll_event  ev;
ev.events = EPOLLIN;
ev.date.fd = listenfd;

epoll_ctl(epfd, EPOLL_CTL_ADD, listenfd, &ev);

// 触发listenfd 的读事件,调用accept 接受新的连接

clientfd = accept(listen_fd,(struct sockaddr *)&addr, sizeof(addr))
ev.events = EPOLLIN;
ev.date.fd = clientfd;
epoll_ctl(epfd, EPOLL_CTL_ADD,clientfd, &ev);

.//服务端主动
// 1. 创建 socket 建立连接
int connectfd = socket(AF_INET, SOCK_STREAM, 0);
connect(connectfd, (struct sockaddr *)&addr,
sizeof(addr));
// 2. 注册监听 connectfd 的写事件
struct epoll_event ev;
ev.events = EPOLLOUT;
ev.data.fd = connetfd
epoll_ctl(efd, EPOLL_CTL_ADD, connectfd, &ev);
// 3. 当 connectfd 写事件被触发,连接建立成功
if (status == e_connecting && e->events &
EPOLLOUT) {
status == e_connected;
// 这里需要把写事件关闭
epoll_ctl(epfd, EPOLL_CTL_DEL, connectfd,
NULL);
}

三、典型reactor 模型

单reactor 模型

在这里插入图片描述

典型 readis

redis命令行采用了单reactor 网络事件模型,在启动时会创建一个I/O多路复用的事件处理器(即reactor)用于监听链路的状态,然后将所有客户端请求都注册到该事件处理器中。当有新连接到达或者已有连接有数据可读写时,事件处理器就会触发相应的回调函数进行处理。

由于redis是单线程运行的,因此只需要一个reactor即可满足其并发处理需求。通过合理地利用CPU资源和异步非阻塞IO技术,redis可以实现高效地处理大量并发请求。

radis 中优化

需要注意的是,当Redis遇到某些长时间执行的命令时,可能会导致其他请求被阻塞而影响整个系统性能。比如三个客户端同时向服务端发送数据,服务端是按先后顺序接收处理。这种就会出现如果先到的数据处理比较耗时,会导致后续客户端出现饥饿现象。优化方式是:
1、如果IO耗时,把IO操作放到IO线程池处理,主线程处理computer。read 、write、encode 、decode等丢入线程池处理
2、如果computer耗时,采用分治思想或者不同时间复杂度的算法

多reactor 模型 多线程(one eventloop per thread)

模型图
在这里插入图片描述

典型 memcached

memcached是一个基于事件驱动的内存缓存服务器,它使用多个reactor来处理并发连接。开启多个线程,每个线程中都有一个独立的reactor 对象。

为什么支持多线程 多reactor

memcached 也是kv类型的数据库,但是value 支持数据结构比较单一不支持多种数据结构, 对于锁的处理比较简单。

具体来说,memcached使用一个主线程和多个工作线程。每个工作线程都有自己的reactor,用于处理客户端连接和请求。当有新连接到达时,主线程(master epoll )会将新的fd分配给某个工作线程,并且该工作线程的reactor会负责处理这个连接的所有事件。

多reactor 模型 多进程 (one eventloop per process)

模型
在这里插入图片描述

典型引用 nginx

nginx是一个基于事件驱动的服务器,它通过多个reactor处理并发连接,它采用多进程的方式(master、slave worker)模型

具体来说,Nginx使用一个主进程(master)和多个worker进程。每个worker进程都有自己的reactor队形,用于处理客户端连接和请求。当有新连接到达时,主进程会将其分配给某个worker进程,并且该worker进程的reactor会负责处理这个连接的所有事件。

在默认情况下,Nginx的worker进程数等于CPU核心数。

nginx流程

Master process 创建的时候会监听listenfd, 然后在fork 出work 进程, work 进程当中都会有一个listenfd 的备份。每个work 进程会创建自己的epoll 对象。并且把listenfd交割epoll 对象管理. 多个进程都监听了listenfd 的读事件,如果listenfd 的全链接队列当中,加入节点的时候,他就会给每一个epoll 对象发送信号,每个epoll 对象都会去触发读事件。这样就产生了惊群现象。在用户层解决这个问题,通过在work 进程当中添加共享锁的方式解决。


总结

单线程单reactor模型,典型是radis 可以把IO放入线程池,也可以把业务计算部分放入线程池。通过回调的方式处理
多线程多reactor模型 如果业务之间交互比较多,但加锁简单,可以用多线程memcached
多进程多reactor模型 如果业务之间交互比较少,可以用多进程ngnix

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/89896.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++(8.21)c++初步

1.斐波那契&#xff1a; #include <iostream> #include<iomanip>using namespace std;int main() {cout << "Hello World!" << endl;int a[10];for(int i0;i<10;i){if(0i||1i){a[i]1;}elsea[i]a[i-1]a[i-2];cout <<setw(4) <&l…

数据库为什么使用B+树而不是B树做索引

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师…

【腾讯云 TDSQL-C Serverless 产品测评】- 云数据库之旅

“腾讯云 TDSQL-C 产品测评活动”是由腾讯云联合 CSDN 推出的针对数据库产品测评及产品体验活动&#xff0c;本次活动主要面向 TDSQL-C Serverless版。 本次参与活动可以涵盖不同技术层面的用户&#xff0c;可以针对TDSQL-C产品的自动弹性能力、自动启停能力、兼容性、安全、并…

计网第四章(网络层)(三)

IPV4地址的应用规划&#xff1a; 定长的子网掩码FLSM&#xff1a; 使用同一个子网掩码划分子网&#xff0c;每个子网所分配的IP地址数量相同&#xff0c;造成IP地址的浪费。 变长的子网掩码VLSM&#xff1a; 使用不同的子网掩码划分子网&#xff0c;每个子网所分配的IP地址…

GEE/PIE遥感大数据处理与典型案例丨数据整合Reduce、云端数据可视化、数据导入导出及资产管理、机器学习算法等

目录 ​专题一&#xff1a;初识GEE和PIE遥感云平台 专题二&#xff1a;GEE和PIE影像大数据处理基础 专题三&#xff1a;数据整合Reduce 专题四&#xff1a;云端数据可视化 专题五&#xff1a;数据导入导出及资产管理 专题六&#xff1a;机器学习算法 专题七&#xff1a;…

Linux常用命令——dhcpd命令

在线Linux命令查询工具 dhcpd 运行DHCP服务器。 语法 dhcpd [选项] [网络接口]选项 -p <端口> 指定dhcpd监听的端口 -f 作为前台进程运行dhcpd -d 启用调试模式 -q 在启动时不显示版权信息 -t 简单地测试配置文件的语法是否正确的&#xff0c;但不会尝试执行任何网络…

人工智能大模型加速数据库存储模型发展 行列混合存储下的破局

数据存储模型 ​专栏内容&#xff1a; postgresql内核源码分析手写数据库toadb并发编程toadb开源库 个人主页&#xff1a;我的主页 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 概述 在数据库的发展过程中&#xff0c;关…

基于STM32的天然气煤气检测报警仿真设计(仿真+程序+讲解)

基于STM32的天然气煤气检测报警仿真设计 演示视频1.主要功能2.仿真3. 程序4. 资料清单&下载链接 仿真图proteus 8.9 程序编译器&#xff1a;keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;C0081 演示视频 基于STM32的天然气煤气可燃气体检测报警仿真设计 1.主要…

【C++入门到精通】C++入门 —— 继承(基类、派生类和多态性)

阅读导航 前言一、继承的概念及定义1. 继承的概念2.继承的定义⭕定义格式⭕继承关系和访问限定符⭕继承基类成员访问方式的变化 二、基类和派生类对象赋值转换三、继承中的作用域四、派生类的默认成员函数五、继承与友元六、继承与静态成员七、复杂的菱形继承及菱形虚拟继承⭕单…

解决 go mod tidy 加载模块超时

如果go mod tidy 加载模块超时 解决方法 修改GOPROXY: 查看go环境相关信息&#xff1a; go envgo env -w GOPROXYhttps://goproxy.cn

若依Cloud集成Flowable6.7.2

项目简介 基于若依Cloud的Jove-Fast微服务项目&#xff0c;集成工作流flowable(接上篇文章) 若依Cloud集成积木报表 项目地址&#xff1a;https://gitee.com/wxjstudy/jove-fast 后端 新建模块 目录结构如下: 引入依赖 前提:引入依赖之前先配置好maven的setting.xml &…

jmeter递增压测线程组配置

jmeter递增压测线程组配置 新建线程组线程组参数详解及填写其他指标设置 新建线程组 操作位置如图&#xff1a; 线程组参数详解及填写 其他指标设置 其他指标设置可参考另一篇文章&#xff1a; 链接: jmeter 在linux服务器中执行性能测试、监听服务器资源指标

skywalking服务部署

一、前言 Apache SkyWalking 是一个开源的分布式跟踪、监控和诊断系统&#xff0c;旨在帮助用户监控和诊断分布式应用程序、微服务架构和云原生应用的性能和健康状况。它提供了可视化的分析工具&#xff0c;帮助开发人员和运维团队深入了解应用程序的性能、调用链和异常情况 …

基于YOLOv8模型和DarkFace数据集的黑夜人脸检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要&#xff1a;基于YOLOv8模型和DarkFace数据集的黑夜人脸检测系统可用于日常生活中检测与定位黑夜下的人脸&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的目标检测&#xff0c;另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目…

词向量及文本向量

文章目录 引言1. 文本向量化2. one-hot编码3. 词向量-word2vec3.1 词向量-基于语言模型 4 词向量 - word2vec基于窗口4.1 词向量-如何训练 5. Huffman树6. 负采样-negative sampling7. Glove基于共现矩阵7.1 Glove词向量7.2 Glove对比word2vec 8. 词向量训练总结9. 词向量应用9…

《剑指Offer》模块4 栈和队列

栈和队列 1. 用两个栈实现队列 原题链接 补充&#xff1a;copy(a,b) 把a赋值给b class MyQueue { public:/** Initialize your data structure here. */stack<int> stk, cache;MyQueue() {}/** Push element x to the back of queue. */void push(int x) {stk.push(x)…

UWB高精度人员定位系统源码,微服务+java+ spring boot+ vue+ mysql技术开发

工业物联网感知预警体系&#xff0c;大中小企业工业数字化转型需求的工业互联网平台 工厂人员定位系统是指能够对工厂中的人员、车辆、设备等进行定位&#xff0c;实现对人员和车辆的实时监控与调度的系统&#xff0c;是智慧工厂建设中必不可少的一环。由于工厂的工作环境比较…

基于微信小程序的餐厅预订系统的设计与实现(论文+源码)_kaic

摘 要 随着消费升级&#xff0c;越来越多的年轻人已经开始不再看重餐饮等行业的服务&#xff0c;而是追求一种轻松自在的用餐、购物环境。因此&#xff0c;无人餐厅、无人便利店、无人超市等一些科技消费场所应势而生。餐饮企业用工荒已成为不争的事实。服务员行业的低保障、低…

癌症预测新利器:弹性逻辑回归让健康更可控!

一、引言 癌症是全球范围内健康领域的重大挑战&#xff0c;早期预测和诊断对于提高治疗效果和生存率至关重要。在过去的几十年里&#xff0c;随着医学和数据科学的快速发展&#xff0c;基于机器学习和统计方法的癌症风险预测成为研究的热点。其中&#xff0c;弹性逻辑回归作为一…

注解和class对象和mysql

注解 override 通常是用在方法上的注解表示该方法是有重写的 interface 表示一个注解类 比如 public interface override{} 这就表示是override是一个注解类 target 修饰注解的注解表示元注解 deprecated 修饰某个元素表示该元素已经过时了 1.不代表该元素不能用了&…