并发、串行;同步、异步;微任务、宏任务;TCP连接;HTTP1.0、HTTP2.0;Dos攻击;域名分片;CDN;队头阻塞;资源合并、延迟加载、预加载。
一股脑全塞进你的大脑,自个好好琢磨吧,祝你度过美好的一天!
并发和串行
并发和串行是描述在浏览器中处理请求的两种不同方式:
并发: 在并发请求中,浏览器可以同时发送多个请求到服务器,并且可以同时接收来自服务器的响应。这意味着浏览器可以同时处理多个请求和响应,从而提高页面加载速度和用户体验。例如,当浏览器加载一个网页时,它可以同时请求页面的 HTML、CSS、JavaScript 文件以及页面中的其他资源,并且可以同时接收这些资源的响应,从而加快页面加载的速度。
串行: 在串行请求中,浏览器一次只能发送一个请求到服务器,并且必须等待上一个请求的响应返回后才能发送下一个请求。这意味着浏览器只能依次处理每个请求和响应,无法同时处理多个请求和响应,因此会导致页面加载速度变慢和用户体验变差。在串行请求中,每个请求都必须等待上一个请求完成后才能开始执行,这样会增加整体加载时间。
通常情况下,浏览器会采用并发请求的方式来加载网页,以提高页面加载速度和用户体验。但是,有时候也会出现并发请求受到限制的情况,例如同一域名下的并发连接数限制,这时候浏览器可能会采用串行请求的方式来加载页面,从而导致页面加载速度变慢。因此,在进行网站性能优化时,需要考虑到并发请求和串行请求的影响,并尽量减少页面加载所需的资源数量,以提高页面加载速度和用户体验。
浏览器并发请求
浏览器并发请求是指浏览器在同一时间向服务器发送多个请求。
浏览器并发请求的优点
-
提高页面加载速度:通过同时发出多个请求,可以更快地加载页面所需的资源,如 HTML、CSS、JavaScript、图像等,从而提高用户体验。
-
有效利用带宽:现代浏览器通常支持并行请求,可以利用可用的网络带宽更高效地下载资源,特别是在高速网络环境下。
-
减少页面加载时间:并发请求可以减少因资源加载而导致的页面阻塞时间,使页面更快地呈现给用户,降低用户等待的感知时间。
-
多域名并行请求:通过使用不同域名(如 CDN 域名)或者子域名,可以进一步增加浏览器的并行请求数量限制,提升页面加载速度。
浏览器并发请求潜在的问题和限制
- 主机并发连接数限制:浏览器对同一域名的并发连接数量有限制,通常为 6-8 个,并发请求超过限制可能会导致队列等待或者资源加载被延迟。(主要是为了避免对服务器造成过大的负载)
-
资源竞争:多个请求同时下载可能导致对同一资源的竞争,例如对于大量请求同一个文件的情况,可能会增加服务器负载或者造成资源争用。
-
并发请求管理:需要合理管理并发请求,避免过多的并发请求导致性能问题,例如通过合理的资源分组、延迟加载等方式来优化并发请求。
并发限制主要出于以下几个原因
-
资源管理:限制并发连接可以避免过度消耗用户设备的资源,如内存和CPU。每个连接都需要系统资源来维护,尤其是在使用HTTP/1.x时,每个请求都需要独立的TCP连接。
-
服务器负载均衡:通过限制客户端的并发请求,可以减轻服务器压力,避免因过多并发请求导致服务器过载或响应缓慢。
-
网络拥塞控制:减少同时发出的请求数量有助于降低网络拥堵,提高整体网络效率。
-
端口资源考虑:操作系统可用的端口资源有限(通常是65535个,但实际可用的远少于此),每个TCP连接需要占用一个端口。限制并发连接可以避免端口耗尽。
这一限制主要是针对到同一域名的TCP连接数,像同步请求、异步请求,这些跟并发数量限制不处于同一维度,对于浏览器来说,只关心同一时间TCP的连接数,至于是什么样的请求他不关心。
一旦浏览器达到了这个限制,它就会开始排队等待前面的请求完成,然后再发送新的请求。当有一个请求完成并释放了连接,浏览器就会开始发送排队中的下一个请求。这个过程被称为"队头阻塞",因为后续的请求必须等待前面的请求完成才能开始执行。
解决浏览器并发请求限制的几种方法
- 域名分片:将资源文件(如图片、CSS、JavaScript)分散到不同的子域名下,这样浏览器就可以同时发送多个请求到不同的子域名,从而绕过单个域名的并发连接数限制,以此增加总体并发能力。例如,将图片资源放在img.example.com,样式文件放在css.example.com,脚本文件放在js.example.com等。
要注意的是,过多的域名会导致DNS查询增加,可能反而影响性能。
① 对于所有接口资源部署在一个服务器上的情况,前端可以预制一个存放端口号
的池子,在发出请求的时候拦截,充分随机分配请求的端口号,然后,在给nginx配置多个server块,开启这些端口的服务,最后代理到真实的后端服务上。这样由多个子域名发出的请求,可以骗过浏览器,从而增加同一时间的整体并发数量。
② 如果子域名也同样限制并发请求数量,那么可以打造一个中台,在中台部署几个节点,然后前端把ip+port
放到池子里,请求的时候拦截并随即分配ip+port
,浏览器发出不同域名的请求到中台的节点上,最后这些节点统一打到后端服务上。
上面这两种方案都是只有一个后端服务,然后通过不同的方式骗过浏览器同一域名下的并发请求数限制,达到增大并发数的目的。但是,会给服务器带来一定的压力。
-
使用HTTP/2或HTTP/3:这些协议支持多路复用,可在单个连接上处理多个请求,从而绕过旧协议的并发限制。
-
资源合并与压缩:减少资源文件数量,如将小图片合并为雪碧图,CSS和JavaScript文件合并,以及启用GZIP压缩等。
-
延迟加载:延迟加载是指在页面初始加载时,只加载必要的资源,而将其他资源推迟到后续需要时再加载。通过延迟加载非关键资源,可以减少初始页面的并发请求数量,提高页面的响应速度。
-
资源预加载:使用
<link rel="preload">
或<link rel="prefetch">
标签来预加载资源,告诉浏览器在后续页面中会用到某些资源,从而让浏览器提前加载这些资源,减少后续请求时的延迟。 -
使用 CDN:使用内容分发网络(CDN)来分发网站的静态资源,CDN 可以将资源缓存到全球各地的服务器上,并通过就近访问提供更快的加载速度,同时也能绕过浏览器对单个域名的并发连接数限制。
我是 甜点cc,个人网站: home.i-xiao.space/vuepress-st…
实干是实干者的通行证!
公众号:【看见另一种可能】