背景介绍
先看一张图,页面一共调用了20多个后端接口,页面出现了明显的卡顿,而且每6个请求一组,只有前一组返回后才执行下一组。看到请求是pending状态,很容易以为是后端接口的问题,有经验的同学可能一眼看出这是浏览器的并发限制导致的,而非后端接口问题。
主流浏览器一般对同一个服务器的并发连接个数都是有限制的,
浏览器为什么要请求并发数限制?
1.对操作系统端口资源考虑 PC总端口数为65536,那么一个TCP(http也是tcp)链接就占用一个端口。操作系统通常会对总端口一半开放对外请求,以防端口数量不被迅速消耗殆尽。
2.过多并发导致频繁切换产生性能问题 一个线程对应处理一个http请求,那么如果并发数量巨大的话会导致线程频繁切换。而线程的上下文切换有时候并不是轻量级的资源。这导致得不偿失,所以请求控制器里面会产生一个链接池,以复用之前的链接。所以我们可以看作同域名下链接池最大为4~8个,如果链接池全部被使用会阻塞后面请求任务,等待有空闲链接时执行后续任务。
3.避免同一客服端并发大量请求超过服务端的并发阈值 在服务端通常都对同一个客户端来源设置并发阀值避免恶意攻击,如果浏览器不对同一域名做并发限制可能会导致超过服务端的并发阀值被BAN掉。
4.客户端良知机制 为了防止两个应用抢占资源时候导致强势一方无限制的获取资源导致弱势一方永远阻塞状态。