单机高并发模型设计

单机高并发技术揭秘----协程应用实践 协程应用实践 阅读详情

背景

在微服务架构下,我们习惯使用多机器、分布式存储、缓存去支持一个高并发的请求模型,而忽略了单机高并发模型是如何工作的。这篇文章通过解构客户端与服务端的建立连接和数据传输过程,阐述下如何进行单机高并发模型设计。

经典C10K问题

如何在一台物理机上同时服务10K用户,及10000个用户,对于java程序员来说,这不是什么难事,使用netty就能构建出支持并发超过10000的服务端程序。那么netty是如何实现的?首先我们忘掉netty,从头开始分析。 每个用户一个连接,对于服务端就是两件事

  1. 管理这10000个连接

  2. 处理10000个连接的数据传输

TCP连接与数据传输

连接建立

我们以常见TCP连接为例。

​一张很熟悉的图。这篇重点在服务端分析,所以先忽略客户端细节。 服务器端通过创建socket,bind端口,listen准备好了。最后通过accept和客户端建立连接。得到一个connectFd,即连接套接字(在Linux都是文件描述符),用来唯一标识一个连接。之后数据传输都基于这个。 数据传输

​为了进行数据传输,服务端开辟一个线程处理数据。具体过程如下

  1. select应用程序向系统内核空间,询问数据是否准备好(因为有窗口大小限制,不是有数据,就可以读),数据未准备好,应用程序一直阻塞,等待应答。

  2. read内核判断数据准备好了,将数据从内核拷贝到应用程序,完成后,成功返回。

  3. 应用程序进行decode,业务逻辑处理,最后encode,再发送出去,返回给客户端

【文章福利】另外小编还整理了一些C++后台开发教学视频,相关面试题,后台学习路线图免费分享,需要的可以自行添加:Q群:720209036 点击加入~ 群文件共享

小编强力推荐C++后台开发免费学习地址:C/C++Linux服务器开发高级架构师/C++后台开发架构师​icon-default.png?t=M666https://ke.qq.com/course/417774?flowToken=1013189

​因为是一个线程处理一个连接数据,对应的线程模型是这样

多路复用

阻塞vs非阻塞

因为一个连接传输,一个线程,需要的线程数太多,占用的资源比较多。同时连接结束,资源销毁。又得重新创建连接。所以一个自然而然的想法是复用线程。即多个连接使用同一个线程。这样就引发一个问题, 原本我们进行数据传输的入口处,,假设线程正在处理某个连接的数据,但是数据又一直没有好时,因为select是阻塞的,这样即使其他连接有数据可读,也读不到。所以不能是阻塞的,否则多个连接没法共用一个线程。所以必须是非阻塞的。

轮询 VS 事件通知

改成非阻塞后,应用程序就需要不断轮询内核空间,判断某个连接是否ready.

for (connectfd fd:  connectFds) {
    if (fd.ready) {
        process();
    }
}

轮询这种方式效率比较低,非常耗CPU,所以一种常见的做法就是被调用方发事件通知告知调用方,而不是调用方一直轮询。这就是IO多路复用,一路指的就是标准输入和连接套接字。通过提前注册一批套接字到某个分组中,当这个分组中有任意一个IO事件时,就去通知阻塞对象准备好了。

select/poll/epoll

IO多路复用技术实现常见有select,poll。select与poll区别不大,主要就是poll没有最大文件描述符的限制。

从轮询变成事件通知,使用多路复用IO优化后,虽然应用程序不用一直轮询内核空间了。但是收到内核空间的事件通知后,应用程序并不知道是哪个对应的连接的事件,还得遍历一下

onEvent() {
// 监听到事件
    for (connectfd fd:  registerConnectFds) {
        if (fd.ready) {
            process();
        }
    }
}

可预见的,随着连接数增加,耗时在正比增加。相比较与poll返回的是事件个数,epoll返回是有事件发生的connectFd数组,这样就避免了应用程序的轮询。

onEvent() {
// 监听到事件
    for (connectfd fd: readyConnectFds) {
       process();
    }
}

当然epoll的高性能不止是这个,还有边缘触发(edge-triggered),就不在本篇阐述了。

非阻塞IO+多路复用整理流程如下:

​

  1. select应用程序向系统内核空间,询问数据是否准备好(因为有窗口大小限制,不是有数据,就可以读),直接返回,非阻塞调用。

  2. 内核空间中有数据准备好了,发送ready read给应用程序

  3. 应用程序读取数据,进行decode,业务逻辑处理,最后encode,再发送出去,返回给客户端

线程池分工

上面我们主要是通过非阻塞+多路复用IO来解决局部的select 和read问题。我们再重新梳理下整体流程,看下整个数据处理过程可以如何进行分组。这个每个阶段使用不同的线程池来处理,提高效率。 首先事件分两种

  1. 连接事件accept动作来处理

  2. 传输事件 select,read,send 动作来处理。

连接事件处理流程比较固定,无额外逻辑,不需要进一步拆分。传输事件 read,send是相对比较固定的,每个连接的处理逻辑相似,可以放在一个线程池处理。而具体逻辑decode,logic,encode 各个连接处理逻辑不同。整体可以放在一个线程池处理。

​服务端拆分成3部分

  1. reactor部分,统一处理事件,然后根据类型分发

  2. 连接事件分发给acceptor,数据传输事件分发给handler

  3. 如果是数据传输类型,handler read完再交给processorc处理

因为1,2处理都比较快,放在线程池处理,业务逻辑放在另外一个线程池处理。 以上就是大名鼎鼎的reactor高并发模型。

参考资料

​推荐一个零声教育C/C++后台开发的免费公开课程,个人觉得老师讲得不错,分享给大家:C/C++后台开发高级架构师,内容包括Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习

原文:单机高并发模型设计 - 掘金

单机高并发模型的设计 在微服务架构下,我们习惯使用多机器、分布式存储、缓存去支持一个高并发的请求模型,而忽略了单机高并发模型是如何工作的。这篇文章通过解构客户端与服务端的建立连接和数据传输过程,阐述下如何进行单机高并发模型设计。如何在一台物理机上同时服务10K用户,及10000个用户,对于java程序员来说,这不是什么难事,使用netty就能构建出支持并发超过10000的服务端程序。那么netty是如何实现的?首先我们忘掉netty,从头开始分析。每个用户一个连接,对于服务端就是两件事:1. 连接建立我们以常见TCP连接为例。一 阅读详情

相关推荐

单机扛10万QPS!Java高并发架构设计实战:从线程模型到JVM调优的终极指南

伪异步:阻塞操作混入NIO线程池缓存雪崩:大量Key同时过期 → 随机过期时间Young GC风暴:过大的Eden区 → 调整单机10万QPS的实现是架构设计、编码规范、系统调优的综合体现。搭建基准环境:使用JMeter建立性能基线逐层优化:从网络到JVM逐层分析瓶颈自动化监控:Prometheus+Grafana实现实时观测。

wx19930913的博客 1427

单机并发方案(高并发方案) 思维导图

定义:指在同一台物理或虚拟服务器上通过优化配置和架构设计以支持大量并发用户请求。挑战资源限制(CPU、内存、I/O等)请求响应时间数据一致性与完整性。

qq_33240556的博客 462

STM32F103四位数码管动态显示实战:从硬件连接到代码调试(附Proteus仿真)

本文详细介绍了STM32F103驱动四位数码管的动态显示技术,从硬件连接到代码调试的全过程。内容包括共阴/共阳数码管的区别、GPIO配置、动态显示原理及优化方法,并附有Proteus仿真验证。通过实战案例,帮助开发者快速掌握STM32数码管动态显示的核心技术。

weixin_29168393的博客 470

阿里终面:Netty 如何做到单机百万并发?

???? 这是一个或许对你有用的社群???? 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料:《项目实战(视频)》:从书中学,往事上“练”《互联网高频面试题》:面朝简历学习,春暖花开《架构 x 系统设计》:摧枯拉朽,掌控面试高频场景题《精进 Java 学习指南》:系统学习,互联网主流技术栈《必读 Java 源码专栏》:知其然,知其所以然????这是一个或许...

芋艿V 698

02-基于ART-PI开发板创建USB CDC 虚拟串口设备

本例在ART-PI开发板上,基于RT-Thread 5.0,5虚拟了一个USB32 CDC串口设备。

arm_fan的专栏 1886

CMake安装grpc生成gRPCTargets.cmake文件

以下是安装语句: cd grpc_folder git submodule update --init cmake .. make -j 4 sudo make install 然而编写依赖gRPC的程序,发现无法调用gRPC的CMake文件,错误提示如下所示: include could not find load file: /usr/local/lib/cmake/g...

2329

单机并发缓存

单机并发缓存 要支持并发操作我们就必须要解决资源的争夺问题,什么是资源的争夺? 例子: var set = make(map[int]bool, 0) func printOnce(num int) { if _, exist := set[num]; !exist { fmt.Println(num) } set[num] = true } func main() { for i := 0; i < 10; i++ { go printOnce(100) } time.Sle

qq_52563729的博客 303

【汇编】TSR内存驻留程序实现与删除及热键设置——以实现时钟为例

【汇编】TSR内存驻留程序实现与删除及热键设置——以实现时钟为例 最近完成了一个关于时钟中断驻留的汇编大作业,对于TSR很是感兴趣,查阅了不少资料,发现现在很少相关的内容资料。尤其是TSR删除这一块几乎找不到在低的水平完全正确的做法,下面我对于TSR的删除我会介绍一种几乎小程序可以完成的方法。当然,标题中的TSR实现,热键设置我也会一一介绍。

cly116的博客 3971

CANN 模型服务化架构设计:从单机推理到生产级高并发部署的完整路径

本文介绍了从单机推理到服务化架构的演进过程。首先对比了单机推理与生产服务的区别,后者需要具备高并发、高可用等特性。随后展示了服务化架构设计,包含负载均衡层、推理实例集群和公共组件。文章重点讲解了单实例推理服务的实现,包括基于ACL的基础推理框架(含初始化、内存管理和推理流程)以及gRPC服务封装方案(定义预测接口、数据格式和模型信息查询)。通过服务化改造,实现了推理能力从开发环境到生产环境的平滑过渡。

2501_93573294的博客 157

运维工程师面试整理-安全常见安全漏洞及修复

暴露在互联网的服务和端口可能会成为攻击者的目标,例如开放的SSH、FTP、Telnet等。:攻击者通过注入恶意脚本,使其在其他用户的浏览器中执行,从而窃取用户信息或劫持用户会话。:通过插入恶意SQL代码,攻击者可以操纵应用程序的数据库查询,执行未授权的数据库操作。:展示你对新兴安全威胁和防护技术的了解和学习能力,如零信任架构、基于AI的安全分析等。在不同的服务器或沙盒环境中处理和存储上传的文件,避免在Web根目录下保存可执行文件。采用安全框架和标准(如OWASP、NIST),确保系统和应用的安全合规性。

不务正业的猿 924

泰山派rk3566 audio音频基础介绍

本文介绍了嵌入式系统中音频处理的基础知识,重点围绕RK3566平台的音频子系统展开。文章首先解释了音频信号从模拟到数字的转换过程,包括采样率、位深和声道等核心概念。随后详细分析了嵌入式音频开发中的关键接口:I2C用于控制音频编解码器,I2S作为专用音频数据传输总线,以及PCM作为原始音频格式和ALSA设备抽象的双重含义。通过对这些基础概念和接口的解析,为在RK3566平台上进行音频驱动开发和应用调试提供了理论基础。

qq_37077309的博客 294

《Redis高并发架构设计:从单机到Cluster的最佳实践》

文章围绕Redis高并发架构设计,介绍从单机到Cluster的演进。摘要将提炼核心要点,助你快速了解Redis架构知识。 ### Redis高并发架构设计:从单机到Cluster的最佳实践摘要 本文聚焦Redis高并发架构设计,阐述基础部署模型差异,单机模式适用于测试等场景,主从+Sentinel满足中小规模业务,Redis Cluster支撑核心生产环境。深入解析Cluster架构槽位分片与高可用原理,针对热点key和跨槽事务痛点,提出多副本、本地缓存及Lua脚本等解决方案。结合去哪儿网实战,分享混合

lcl_032015的博客 734

一文吃透 SAP HANA JSON Document Store:从架构到实战的完整指南

本文详细介绍了SAP HANA的JSON Document Store功能,包括其定位、架构、典型场景以及具体使用方法。文章首先分析了半结构化数据场景下传统关系模型的局限性,说明Document Store如何通过集合(Collection)存储JSON文档来提供灵活性。随后详细阐述了启用方式、SQL语法、与Column Store的联动机制,并提供了大量可直接复用的实战案例。特别强调了Document Store作为HANA内建服务的优势,包括企业级一致性、备份恢复等能力。最后给出了数据类型处理和跨引擎协

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 201

‌WebSocket 性能调优:从单机到分布式的高并发实现

WebSocket 是一种全双工通信协议,广泛应用于实时应用(如聊天系统、在线游戏和实时数据推送)。本文将逐步指导您从单机优化扩展到分布式架构,实现高效的高并发处理。所有建议基于真实实践,确保可靠性。通过上述步骤,您可以从单机优化平滑过渡到分布式系统,支持百万级并发连接。实际部署时,根据业务需求调整参数(如消息大小或心跳间隔),并持续测试优化。当单机无法满足需求时(例如连接数超过 10,000),需扩展到分布式架构。在单台服务器上优化 WebSocket,目标是最大化连接数和消息处理效率。

2501_93894620的博客 1026

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

tps 数据库写并发衡量_你们系统是怎么保证高并发的

相信每一位程序员对于高并发这个词都并不陌生,现在一般中大型互联网公司都需要自己的业务能支撑高并发,我们常说的高并发其实就是说我们的设计系统的性能问题,简单一句话即同一时刻我们的系统能处理多少请求。带着问题阅读,如果领导让你来设计公司的一个核心系统(比如订单系统)要符合公司现有的业务情况,TPS在10000左右(好多成熟性的互联网公司jd上也要求具备这样的经验),还要注重用户体验,总不能下了单等了几...

weixin_39617113的博客 171

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

高并发的socket的高性能设计

高性能数据传输系统的框架设计1 引言   随着互联网和物联网的高速发展,使用网络的人数和电子设备的数量急剧增长,其也对互联网后台服务程序提出了更高的性能和并发要求。本文的主要目的是阐述在单机上如何进行高并发、高性能消息传输系统的框架设计,以及该系统的常用技术,但不对其技术细节进行讨论。如您有更好的设计方案和思路,望共分享之![注:此篇用select来讲解,虽在大并发的情况下,epoll拥有更高的效...

516843761 1万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

高并发之nginx架构

Nginx作为高性能Web服务器的代表,其成功源于对操作系统能力的极致利用。为解决C10K问题,Nginx采用了多进程事件驱动架构,结合epoll等I/O多路复用技术,实现单线程处理数万并发连接。其核心优化包括:Master-Worker多进程模型实现进程隔离,epoll机制实现O(1)事件处理,零拷贝技术减少数据传输开销。通过这些创新设计,Nginx将传统Web服务器的单机并发能力提升到百万级别,证明了合理架构与系统调优可以突破硬件限制。Nginx的成功经验表明,充分利用操作系统特性比发明新理论更能有效解

930

tps 数据库写并发衡量_【高并发】互联网高并发系统设计方案(java Pyton php均适用)...

高并发设计相信每一位程序员对于高并发这个词都并不陌生,现在一般中大型互联网公司都需要自己的业务能支撑高并发,我们常说的高并发其实就是说我们的设计系统的性能问题,简单一句话即同一时刻我们的系统能处理多少请求。带着问题阅读,如果领导让你来设计公司的一个核心系统(比如订单系统)要符合公司现有的业务情况,TPS在10000左右(好多成熟性的互联网公司jd上也要求具备这样的经验),还要注重用户体验,总不能下...

weixin_29486701的博客 236

RVC模型从单机到集群:水平扩展应对高并发语音请求

本文介绍了如何利用星图GPU平台,自动化部署RVC(Retrieval-based Voice Conversion)镜像,构建高并发语音转换服务集群。通过负载均衡与水平扩展,该方案能有效应对直播互动、在线游戏等场景中的高并发语音变声请求,提升服务稳定性和处理能力。

weixin_36369848的博客 206

设计高性能高并发网络

本文围绕设计高性能高并发网络系统的几种网络模型进行了详细阐述介绍

zrush的博客 287

高并发的socket的高性能设计【转】

转自:https://blog.youkuaiyun.com/quincyfang/article/details/44654351 高性能数据传输系统的框架设计     1 引言    随着互联网和物联网的高速发展,使用网络的人数和电子设备的数量急剧增长,其也对互联网后台服务程序提出了更高的性能和并发要求。本文的主要目的是阐述在单机上如何进行高并发、高性能消息传输系统的框架设计,以及该系统的常用技...

weixin_34032827的博客 240

揭秘Go高并发:Goroutine与MPG模型,为何能轻松支撑单机10万+并发

本文深入解析了Go语言实现高并发的核心机制。首先指出Goroutine并非操作系统线程,而是用户态轻量级任务单元,初始栈仅2KB,单机可轻松承载10万+并发。其次详细阐述了MPG调度模型:Goroutine(G)由Processor(P)管理,最终由绑定内核线程的Machine(M)执行,三者协同实现高效调度。文中还介绍了工作窃取和抢占式调度两大优化机制,并通过实测验证了Go在普通机器上即可实现10万并发。最后给出生产环境建议,包括合理设置GOMAXPROCS、避免Goroutine泄漏等。Go的高并发能力

记录成长‌,知识沉淀,连接同行‌ 679
上一篇: 什么是传输层协议TCP/UDP???
下一篇: 【后端开发】Reactor 模型详解
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值