im即时通讯软件开发:一文即懂什么是高并发

article/2025/11/5 10:35:04

在即时通讯网社区里,多是做IM、消息推送、客服系统、音视频聊天这类实时通信方面的开发者,在涉及到即时通讯技术时聊的最多的话题就是高并发、高吞吐、海量用户。

代码还没开始写,就考虑万一哪天这IM用户量破百万、千万该怎么办的问题,是多数程序员的基本修养。

在面视即时通讯相关工作的时候,高并发也是必谈问题,那到底什么是高并发?嗯,真要说出个所以然来,还真有点懵。

什么是高并发?

高并发是互联网系统架构的性能指标之一,它通常是指单位时间内系统能够同时处理的请求数。

简单点说,就是QPS(Queries per second)。

那么我们在谈论高并发的时候,究竟在谈什么东西呢?归根结底,到底什么是高并发?

高并发究竟是什么?

这里先给出结论:

1)高并发的基本表现为单位时间内系统能够同时处理的请求数;

2)高并发的核心是对CPU资源的有效压榨。

举个例子:如果我们开发了一个叫做MD5穷举的应用,每个请求都会携带一个md5加密字符串,最终系统穷举出所有的结果,并返回原始字符串。这个时候我们的应用场景或者说应用业务是属于CPU密集型而不是IO密集型。

这个时候CPU一直在做有效计算,甚至可以把CPU利用率跑满,这时我们谈论高并发并没有任何意义。(当然,我们可以通过加机器也就是加CPU来提高并发能力,这个是一个正常猿都知道废话方案,谈论加机器没有什么意义,没有任何高并发是加机器解决不了,如果有,那说明你加的机器还不够多!)

对于大多数互联网应用来说,CPU不是也不应该是系统的瓶颈,系统的大部分时间的状况都是CPU在等I/O(硬盘/内存/网络) 的读/写操作完成。

这个时候就可能有人会说,我看系统监控的时候,内存和网络都很正常,但是CPU利用率却跑满了这是为什么?

这是一个好问题,后文我会给出实际的例子,再次强调上文说的“有效压榨”这4个字,这4个字会围绕本文的全部内容!

控制变量法

万事万物都是互相联系的,当我们在谈论高并发的时候,系统的每个环节应该都是需要与之相匹配的。

1)我们会经过DNS服务器的解析,请求到达负载均衡集群;

2)负载均衡服务器会根据配置的规则,想请求分摊到服务层。服务层也是我们的业务核心层,这里可能也会有一些RPC、MQ的一些调用等等;

3)再经过缓存层;

4)最后持久化数据;

5)返回数据给客户端。

要达到高并发,我们需要负载均衡、服务层、缓存层、持久层都是高可用、高性能的。

甚至在第5步,我们也可以通过压缩静态文件、HTTP2推送静态文件、CDN来做优化,这里的每一层我们都可以写几本书来谈优化。

本文主要讨论服务层这一块,即图红线圈出来的那部分。不再考虑讲述数据库、缓存相关的影响。

高中的知识告诉我们,这个叫控制变量法

那我们再谈谈上下文切换:

在谈论上下文切换之前,我们再明确两个名词的概念:

1)并行:两个事件同一时刻完成;

2)并发:两个事件在同一时间段内交替发生,从宏观上看,两个事件都发生了。

线程是操作系统调度的最小单位,进程是资源分配的最小单位。由于CPU是串行的,因此对于单核CPU来说,同一时刻一定是只有一个线程在占用CPU资源的。因此,Linux作为一个多任务(进程)系统,会频繁的发生进程/线程切换。

在每个任务运行前,CPU都需要知道从哪里加载,从哪里运行,这些信息保存在CPU寄存器和操作系统的程序计数器里面,这两样东西就叫做CPU上下文。

进程是由内核来管理和调度的,进程的切换只能发生在内核态,因此虚拟内存、栈、全局变量等用户空间的资源,以及内核堆栈、寄存器等内核空间的状态,就叫做进程上下文。

前面说过,线程是操作系统调度的最小单位。同时线程会共享父进程的虚拟内存和全局变量等资源,因此父进程的资源加上线上自己的私有数据就叫做线程的上下文。

对于线程的上下文切换来说,如果是同一进程的线程,因为有资源共享,所以会比多进程间的切换消耗更少的资源。

现在就更容易解释了,进程和线程的切换,会产生CPU上下文切换和进程/线程上下文的切换。而这些上下文切换,都是会消耗额外的CPU的资源的。

进一步谈谈协程的上下文切换:

那么协程就不需要上下文切换了吗?需要,但是不会产生 CPU上下文切换和进程/线程上下文的切换,因为这些切换都是在同一个线程中,即用户态中的切换,你甚至可以简单的理解为,协程上下文之间的切换,就是移动了一下你程序里面的指针,CPU资源依旧属于当前线程。即时通讯聊天软件app开发可以加蔚可云的v:weikeyun24咨询

需要深刻理解的,可以再深入看看Go的GMP模型。

最终的效果就是协程进一步压榨了CPU的有效利用率。

回到开始的那个问题

这个时候就可能有人会说,我看系统监控的时候,内存和网络都很正常,但是CPU利用率却跑满了这是为什么?

注意本篇文章在谈到CPU利用率的时候,一定会加上有效两字作为定语,CPU利用率跑满,很多时候其实是做了很多低效的计算。

以"世界上最好的语言"为例。

典型PHP-FPM的CGI模式,每一个HTTP请求:

    1)都会读取框架的数百个php文件;

    2)都会重新建立/释放一遍MYSQL/REIDS/MQ连接;

    3)都会重新动态解释编译执行PHP文件;

    4)都会在不同的php-fpm进程直接不停的切换切换再切换。

php的这种CGI运行模式,根本上就决定了它在高并发上的灾难性表现。

找到问题,往往比解决问题更难。当我们理解了高并发之后,我们会发现高并发和高性能并不是编程语言限制了你,限制你的只是你的思想。

找到问题,解决问题!当我们能有效压榨CPU性能之后,能达到什么样的效果?

下面我们看看 php+Swoole的HTTP服务与Java高性能的异步框架Netty的HTTP服务之间的性能差异对比。


http://chatgpt.dhexx.cn/article/k1yF430j.shtml

相关文章

即时通讯软件源代码_提高软件开发效率的神器,马上收藏起来吧

根据用户开发水平的差异,力软敏捷开发框架提供多种实现业务功能的开发模式。 如果您是初级开发者或者您根本就不会编程那也不要紧,系统可以根据开发向导直接进行功能开发,不需要编写一行代码也无需编译就个完成开发过程。 如果您是一名专业的…

QT开发的即时通讯聊天软件

最近项目需求用QT开发了一款即时通讯软件,差不多了上几个图看看。 登陆界面 主界面-用户列表 最近消息界面 好友聊天界面 文件传输界面 查找和添加好友 消息管理器 系统设置界面 先传这么多,:)

基于C++的即时通信软件设计

目录 — 、 概 述 1 1 . 1 设 计 目 的 : 1 1 . 2 设 计 内 容 : 1 1 . 2 . 1 功 能 设 计 : 1 1 . 2 . 2 界 面 设 计 : 1 1 . 2 . 3 客 户 端 、 服 务 器 设 计 : 1 1 . 3 设 计 要 求 : 1 二 、 设 计 …

企业即时通讯软件开发基本功能有哪些?

即时通讯是基于互联网技术的新型交流沟通方式,是目前最流行的通讯方式,广泛的应用市场使得各种各样的即时通讯软件系统也层出不穷,企业即时通讯就是其中的一种延伸。是一种面向企业终端使用者的网络营销、网络沟通和内容管理的工具服务&#…

IM即时通讯软件开发

废话不多说,要想知道社交IM系统软件公司哪家靠谱,教你怎么辨别软件开发公司靠谱。 一:哪些IM即时通讯软件开发公司不靠谱?用十余年经验,总结出行业公司不靠谱通病。 1、对于一款社交IM系统软件,软件公司给…

移动开发即时通讯APP源码聊天社交软件解决方案

即时通讯app源码特点 1、即时通讯适合的场景包括文字、语音、音视频播放等,比较偏向于文字方面的聊天 2、即时通讯非常适合聊天平台源码的文字聊天,能有效保证用户之间的聊天效率, 3、即时通讯支持消息的采集、处理、编码、解码、播放和渲染…

即时通讯在线聊天APP开发解决方案

即时通讯是目前移动端最为流行的通讯方式,各种各样的即时通讯软件也层出不穷;服务提供商也提供了越来越丰富的通讯服务功能,打造一个实时通信系统,允许两人或多人使用网络实时的传递文字消息、文件、语音与视频交流。今天河北领行…

开发即时通讯到底需要什么样的技术,需要多久的时间

互联网时代催生了许多新的产业和制度,在各类互联网公司中,软件开发,尤其是即时通讯软件的开发和应用,是重要的组成部分。很多人一想到即时通讯,就会被其高质量的信息通信技术和快速的信息传输速度所折服,同…

一个简单的即时通讯工具的设计与开发

技术:Java等 摘要: 即时通讯(Instant Messaging)是目前Internet上最为流行的通讯方式,各种各样的即时通讯软件也层出不穷;服务提供商也提供了越来越丰富的通讯服务功能。Java是当前比较流行的开发语言之一&…

C++ 在函数中用static定义的变量的

在C中&#xff0c;在函数中使用static定义一个变量&#xff0c;该变量最终只会分配一次内存&#xff0c;如果下次继续调用该函数&#xff0c;不会再重新分配内存给变量&#xff0c;而是使用上次分配的内存。 #include<iostream> using namespace std;class StaticVer { …

C语言的static函数

前几天&#xff0c;一个同事跟我说在我们的代码库里面看到&#xff0c;一个static函数被放在了头文件里面&#xff0c;可构建的时候却没有报告链接错误。我的第一反应也是&#xff0c;函数被放在头文件里面&#xff0c;当这个头文件被多个源文件引用之后&#xff0c;再把那几个…

c与c++ static函数的区别

c与c static函数的区别 c 与c static 函数的区别 static 关键字是 C, C 中都存在的关键字 , 它主要有三种使用方式 , 其中前两种只指在 C 语言中使用 , 第三种在 C 中使用 (C,C 中具体细微操作不尽相同 , 本文以 C 为准 ).(1) 局部静态变量 (2) 外部静态变量 / 函数 (3) 静…

static的在函数中作用

看如下例子 #include<stdio.h> int f() {static int k0;//用static&#xff0c;k只会在第一次调用这个函数时初始化为0&#xff0c;此后不再初始化k;return k; } int main() {printf("%d\n",f()); printf("%d\n",f()); 再次次调用f()函数&#xff0…

c++中static的用法详解

C 语言的 static 关键字有三种&#xff08;具体来说是两种&#xff09;用途&#xff1a; 1. 静态局部变量&#xff1a;用于函数体内部修饰变量&#xff0c;这种变量的生存期长于该函数。 下面展示一些 内联代码片。 int foo(){static int i 1; // note:1//int i 1; // not…

C语言中static函数

转载自&#xff1a; https://blog.csdn.net/cw616729/article/details/95003577 https://blog.csdn.net/keyeagle/article/details/6708077 1.含义&#xff1a; 定义为static的函数&#xff0c;作用域为本文件&#xff0c;它只能在定义该函数的源文件中使用。 2.好处 使用s…

static作用(修饰函数、局部变量、全局变量)

C语言&#xff1a;static作用&#xff08;修饰函数、局部变量、全局变量&#xff09; 一、 static全局变量与普通的全局变量有什么区别 ? 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。 全局变量本身就是静态存储方式&#xff0c; 静态全局变量当然也…

数据链路层协议 ——— 以太网协议

文章目录 链路层解决的问题以太网协议认识以太网以太网帧格式认识MAC地址对比理解MAC地址和IP地址认识MTUMUT对IP协议的影响MTU对UDP协议的影响MTU对TCP协议的影响数据跨网络传输的过程 ARP协议ARP协议的作用ARP数据的格式ARP协议的工作流程 链路层解决的问题 IP拥有将数据跨网…

DNS详解

前言&#xff1a; 前面讲了域名、IP&#xff0c;那么还缺少一个主角—DNS。这些都是网络中最最最基础的&#xff0c;也是最重要的概念&#xff0c;很有必要深入学习下。 网站打开的原理 我们在通过网站网址打开网站的过程中&#xff0c;其实就是浏览器获取到了隐藏在网址背后的…

一文读懂物联网 MQTT 协议之实战篇

一、前言 上一篇我们介绍了 MQTT 协议格式以及相关的特性&#xff1a;一文读懂物联网 MQTT 协议之基础特性篇&#xff0c;这一篇我们就来实战一番&#xff0c;理论得与实践结合&#xff0c;方能吃透 MQTT。 我的那个读者还提到了讲一下 Mosquitto&#xff0c;这是一款开源消息…

基于光流传感器定位和导航的自主飞行无人机

基于光流传感器定位和导航的自主飞行无人机 An Autonomous UAV with an Optical Flow Sensor for Positioning and Navigation 注&#xff1a;翻译水平有限&#xff0c;错误之处&#xff0c;敬请指正&#xff01; 原文链接&#xff1a;http://cdn.intechopen.com/pdfs/45731.p…