2.4 网络设计与redis、memcached、nginx组件

news2024/11/27 5:34:18

目录

  • 一、网络模块需要处理哪些事情
  • 二、reactor网络设计模型
  • 三、网络模块与业务的关系
  • 四、redis、memcached、nginx
    • 1、redis
    • 2、memcached
    • 3、ngnix
    • 4、总结


在这里插入图片描述

一、网络模块需要处理哪些事情

网络编程主要关注客户端与服务端交互的四个问题:
1、连接建立
2、消息到达
3、消息发送
4、连接断开
在这里插入图片描述
以上四个问题归结到底是网络IO,IO函数主要有两个作用:
1、检测IO是否就绪
2、进行IO操作—accept、connect、read、write

accept、connect是关于网络的连接建立。accept检测全连接队列中是否有数据,如果有则从中取出一个节点,返回一个对象clientfd,以及客户端的IP地址。connect是对于客户端而言,如果客户端收到ACK,即连接建立成功。(对应三次握手)
在这里插入图片描述
read是把数据从内核态read buffe拷贝到用户态中,当期为0代表read buffer中读到EOF
write是把数据从用户态拷贝到内核态write buffe中
在这里插入图片描述
读和写的区分:以“读书”和“写字”为例子。所谓读书:就是书籍上的文字通过人的视觉系统,经神经系统在大脑里产生主观映像;写字就是大脑里产生的主观映像通过神经系统控制运动器官——手在纸上写出字。“读”与“写”是把大脑作为中心,由外界向中心输入,就是“读”;由中心向外界输出就是“写”。现在“读”与“写”的问题就变成了输入和输出的关系了。
以电脑CPU为中心。从外界的设备(键盘,磁盘等等)向CPU传递信息就是“读操作”,由CPU向外界设备(屏幕,磁盘等等)传递信息就是“写操作”。
例如对于全双工通信的TCP协议
在这里插入图片描述

二、reactor网络设计模型

IO多路复用的主要功能是检测多条连接的IO是否就绪,但不具备具体IO操作的功能(比如读写数据)。常见的IO多路复用器有select、poll,epoll,他们是对IO的管理,检测接入的IO,触发IO事件;注意这三个都是同步IO。

reactor网络设计模型是把IO就绪检测的功能交由IO多路复用器实现,针对事件进行进行IO操作,不同的事件调用不同的回调函数。

int nready = epoll_wait(reactor.epfd, events, EVENTS_LEN, timeouts);
int i = 0;
for (i=0; i< nready; i++){
	if (events[i].events & EPOLLIN){//触发读事件

		listenfd --> 新连接到达--> accept
		clientfd --> 这条连接发送了数据 --> read

	}else{ //触发写事件

		connectfd --> 连接建立成功,可向第三方(如数据库)发送数据
		clientfd -->  这条连接写缓冲区可写 -->write

	}
}

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

三、网络模块与业务的关系

在这里插入图片描述

  1. 创建socket,生成listenfd,通过bind绑定,通过listen监听。
  2. 把listenfd注册到reactor,注册读事件(客户端与服务端建立连接)。
  3. 如果listenfd读事件触发,调用accept接收连接生成clientfd,然后把clientfd注册到reactor中,注册读事件(客户端向服务端发送数据)。
  4. 当客户端发送数据时,会触发clientfd读事件相应的回调函数。 读数据—解析(协议)数据—处理业务相关的计算—加密打包—回复数据

四、redis、memcached、nginx

1、redis

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

由于redis是单线程运行的,因此只需要一个reactor即可满足其并发处理需求。通过合理地利用CPU资源和异步非阻塞IO技术,redis可以实现高效地处理大量并发请求。
在这里插入图片描述
需要注意的是,当Redis遇到某些长时间执行的命令时,可能会导致其他请求被阻塞而影响整个系统性能。比如三个客户端同时向服务端发送数据,服务端是按先后顺序接收处理。这种就会出现如果先到的数据处理比较耗时,会导致后续客户端出现饥饿现象。优化方式是:
1、如果IO耗时,把IO操作放到IO线程池处理,主线程处理computer。
2、如果computer耗时,采用分治思想或者不同时间复杂度的算法

2、memcached

memcached是一个基于事件驱动的内存缓存服务器,它使用多个reactor来处理并发连接。

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

在默认情况下,memcached的工作线程数等于CPU核心数。
在这里插入图片描述

3、ngnix

Nginx是一个基于事件驱动的服务器,它通过多个reactor处理并发连接。

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

在默认情况下,Nginx的worker进程数等于CPU核心数。
在这里插入图片描述

  1. 创建 Listenfd bind 监听
  2. worker 进程都有 Listenfd
  3. worker 进程争夺 accept 锁
  4. 谁争夺到了锁,谁就有接收新连接的权利
  5. 接收的连接放入该 worker

4、总结

redis是单线程单reactor,可以把IO放入线程池,也可以把业务计算部分放入线程池。
如果业务之间交互比较多,但加锁简单,可以用多线程memcached
如果业务之间交互比较少,可以用多进程ngnix

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学历不代表能力,但学历不够就意味着没资格!

今年的高考报名人数再创历史新高。 据悉&#xff0c;2023年全国高考报名人数1291万人&#xff0c;比去年增加98万人。 那么&#xff0c;今年的高校毕业生人数呢&#xff1f; 据人社部统计,今年我国高校毕业生人数达到1158万&#xff0c;继2022年破千万后再创历史新高。 大家…

Vue路由到新的页面,页面的名称需要改变

如下图&#xff1a;在页面中点击“属性列表”和“参数列表”的时候&#xff0c;要路由到新的页面&#xff0c;之后页面的title不用路由中的名称&#xff0c;而是用新的名称。也就是要显示对应的按钮名称&#xff0c;这个路由地址的名称是动态的。 在旧的页面上加上&#xff1a;…

汇报演示领导都说好,只因用了Smartbi幻灯片这个功能

在日常工作中&#xff0c;定期以PPT的方式汇报工作是非常常见的需求。假设你是一位销售经理&#xff0c;每个月都要参加公司的销售会议。在会议上&#xff0c;你需要向团队和高层展示销售数据、市场趋势和业绩报告等信息。过去&#xff0c;你通常是PPT来制作演示文稿&#xff0…

链表及相关面试题

链表 单链表 特点&#xff1a; 逻辑上顺序存储&#xff0c;物理上无序存储头指针根据情况而定&#xff0c;不保存数据&#xff0c;很多操作需要头指针&#xff0c;比如原地反转链表。每个节点包含 data, Node next保存下个Node public class LinkList {public Node headern…

系统初始化加载动画逻辑以及隐藏

需求&#xff1a;进入系统默认有如下的加载界面&#xff0c;但是由于网页内嵌到了其他网页中&#xff0c;这种环境下进入时再加载就不合适&#xff0c;需要隐藏掉。 因此本文的内容逻辑为 文章目录 研究加载逻辑解决需求&#xff1a;在被内嵌时隐藏掉loading 研究加载逻辑 1.…

【SpinalHDL快速入门】3、Scala 快速入门

SpinalHDL本质上来讲是Scala语言的一个库&#xff0c;所以需要先学习Scala&#xff0c;才能在此基础上学习SpinalHDL。 文章目录 Scala 基础Scala 数据类型&#xff08;5种&#xff1a;Boolean、Int、Float、Double、String&#xff09;Scala VariablesScala FunctionsReturnRe…

Python自动化测试框架:unittest介绍

Unittest是Python中最常用的测试框架之一&#xff0c;它提供了丰富和强大的测试工具和方法&#xff0c;可以帮助开发者更好地保证代码质量和稳定性&#xff0c;本文就来介绍下Unittest单元测试框架。 1. 介绍 unittest是Python的单元测试框架&#xff0c;它提供了一套丰富的测…

2023软件测试卷出天际!!!性能测试为啥一枝独秀?

近十年是中国互联网发展最快的10年&#xff0c;互联网用户从4亿增长至10亿。面对用户量的暴增&#xff0c;用户体验就成为互联网产品最大的考验。而 影响用户体验的最重要因素就是性能。 流量为王的时代&#xff0c;性能测试是所有产品上线前必须通过的重要环节。 企业招聘性…

12米与30米TanDEM-X数字高程模型DEM数据的下载申请方法

本文介绍全球12米与30米高空间分辨率的数字高程模型&#xff08;DEM&#xff09;数据——TanDEM-X数据的下载申请方法。 Tandem-X卫星项目于2010年6月启动&#xff0c;并于2010年6月21日和2010年12月21日分别发射两颗卫星&#xff0c;即TerraSAR-X和TanDEM-X。Tandem-X卫星之间…

裸辞3个月,面试了25家公司,这难度真不一般····

上半年裁员&#xff0c;下半年裸辞&#xff0c;有不少人高呼裸辞后躺平真的好快乐&#xff01;但也有很多人&#xff0c;裸辞后的生活五味杂陈。 面试25次终于找到心仪工作 因为工作压力大、领导PUA等各种原因&#xff0c;今年2月下旬我从一家互联网小厂裸辞&#xff0c;没想到…

【Android】WMS(五)输入事件原理

输入事件原理 安卓输入事件整体流程 Android 系统是由事件驱动的&#xff0c;而 input 是最常见的事件之一&#xff0c;用户的点击、滑动、长按等操作&#xff0c;都属于 input 事件驱动&#xff0c;其中的核心就是 InputReader 和 InputDispatcher。 InputReader 和 InputD…

申请国家标准项目管理专业人员能力评级(CSPM)报名条件有哪些?

2021年10月&#xff0c;中共中央、国务院发布的《国家标准化发展纲要》明确提出构建多层次从业人员培养培训体系&#xff0c;开展专业人才培养培训和国家质量基础设施综合教育。建立健全人才的职业能力评价和激励机制。由中国标准化协会&#xff08;CAS&#xff09;组织开展的项…

3.JavaScript常用对象数组对象

3.1、数组对象 3.1.1、概述 目录 3.1、数组对象 3.1.1、概述 3.1.2、创建数组 3.1.2.1、使用对象创建 3.1.2.2、使用字面量创建 3.1.3、遍历数组 3.1.4、数组属性 3.1.5、数组方法 3.2、函数对象 3.2.1、call()和apply() 3.2.2、this指向 3.2.3、arguments参数 3…

JavaSE-06 [面向对象+封装]

JavaSE-06 [面向对象封装] 第一章 面向对象思想 1.1 面向过程和面向对象 面向过程&#xff1a; 面向过程就是分析出解决问题所需要的步骤&#xff0c;然后用函数把这些步骤一步一步实现&#xff0c;使用的时候一个一个依次调用就可以了面向对象&#xff1a; 面向对象是把构成…

PYTHON元素定位方式总结

一&#xff0c;常用的8种定位方式 id定位 driver.find_element_by_id("id 值")   driver.find_element(by "id", value "ID值" ) name定位 单个元素&#xff1a;     driver.find_element_by_name("name值")     drive…

总结:记一次docker调试镜像的问题

一、背景 同事让帮忙部署一个应用到QKE&#xff0c;给了我镜像地址与配置文件。 由于要将配置文件映射到容器中&#xff0c;我创建了configmap&#xff0c;然后应用中将configmap中key对应的内容映射到了容器中的配置文件中。 但是我遇到了一个问题&#xff1a; 容器频繁快…

100多的ipad触控笔好用吗?ipad可以用的手写笔推荐

随着IPAD的普及&#xff0c;一些学习党已经从传统的纸质教学走向了无纸化教学。所以&#xff0c;本来就是苹果品牌专利的电容笔&#xff0c;现在更是成为了炙手可热的产品&#xff0c;很多人都对这款售价近千元的电容笔充满了好奇。我认为&#xff0c;对于职业画师来说&#xf…

你“心累”吗?教你方法

解决“心累”的方法来了 前言一、“心累”的原因二、认识“心累”三、走出“心累”四、发现自己的“优势” 前言 不管是脑力劳动还是体力劳动&#xff0c;工作生活本身并没有多么累&#xff0c;但总感觉累。这就是我今天想说的话题&#xff1a;心累。 如果你也被这个状态折磨&a…

用好 mysql 分区表

为了保证mysql的性能&#xff0c;我们都建议mysql单表不要太大&#xff0c;也经常有人问我这样的问题&#xff0c;整体来说呢&#xff0c;建议是&#xff1a;单表小于2G&#xff0c;记录数小于1千万&#xff0c;十库百表。如果但行记录数非常小&#xff0c;那么记录数可以再偏大…

粮油企业MES系统源码 粮油质量管控防伪溯源系统

粮油企业MES系统源码 粮油企业质量管控防伪溯源系统源码 粮油企业ERP系统源码 农产品MES系统源码 农产品溯源系统源码 利用物联网、云计算 、区块链、人工智能、5G等先进技术&#xff0c;结合特有的码码关联和RSA加密验证技术&#xff0c;开发的一套粮油质量管控防伪溯源系统&…