CHROME浏览器发送HTTP最大请求并发数限制

这篇博客探讨了浏览器对同一域名下HTTP请求的并发限制。实验结果显示,同一GET请求只能并发1个,而不同GET/POST请求的并发数为6。当达到并发上限,后续请求会被放入队列等待。作者注意到在某些情况下,如禁用缓存,原本的并发限制表现出现异常,值得进一步研究。

一、先上结论:

①同一域名下,同一GET请求的并发数是1,也就是说上一个请求结束,才会执行下一个请求,否则置入队列等待发送;

②同一域名下,不同GET/POST请求的并发数量是6。当发送的请求数量达到6个,并且都没有得到响应时,后面的请求会置入队列等待发送。

二、测试

1、服务器端

服务器端创建了一个GET请求的serve方法和一个POST请求的serve方法,方法内容都是保持方法执行时间≥3s。

package com.example.demo.controller;

import com.alibaba.fastjson.JSON;
import org.springframework.web.bind.annotation.*;

@RestController
@CrossOrigin({"*"})
public class MainController {

    @GetMapping("/index")
    @ResponseBody
    public Object index(@RequestParam String id) {
        sleep3seconds();
        return JSON.toJSONString("a get method");
    }

    @PostMapping("/index2")
    @ResponseBody
    public Object index2() {
        sleep3seconds();
        return JSON.toJSONString("a post method");
    }

    private void sleep3seconds() {
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

2、请求端

①同一GET请求

for (let i=0; i<10; i++) fetch("http://localhost:8080/index?id=1", {method: "get"}).then(r=>r.json()).then(d=>console.log(d));

结果

  可以看到从第一个请求pending开始,后面的请求都是pending状态。随着前一个请求的响应结束,后面的请求陆续也得到了响应。各个请求的响应时间如下图:

比较奇怪的是,10个请求当中,后面3个请求的响应结束时间是一样的按理说,如果存在阻塞的话,这3个请求应当会间隔3s左右才会陆续结束才对。感觉浏览器当中还存在某种机制待挖掘。后面再调查。

②不同的GET请求

for (let i=0; i<10; i++) fetch("http://localhost:8080/index?id="+i, {method: "get"}).then(r=>r.json()).then(d=>console.log(d));

结果:

 达到最大并发数:6之后,再有请求进入会pending,并且会非常规律地每6个请求一批,没有上面那种情况的幺蛾子。

 ③POST请求

for (let i=0; i<10; i++) fetch("http://localhost:8080/index2", {method: "post"}).then(r=>r.json()).then(d=>console.log(d));

结果:

 和②的结果一致,6个请求一批,非常规律。

④补充一种情况(同①)

开启控制台,network一栏下勾选disable cache,再进行①的测试,结果竟然和②③是一致的,出现了允许最大6个并发的请求这种结果。然而在实际使用web应用的时候,也不会进行这种操作,所以不知道是否有其他开发手段有同样的效果。

①的情况确实比较意外,阻塞就阻塞吧,突然又开始并发了,待确认~如果有了解的大佬,望指点迷津,不甚感激~

### HLS 播放逻辑规则 HLS(HTTP Live Streaming)是苹果公司开发的一种基于 HTTP 的流媒体传输协议,广泛用于直播和点播场景。其核心逻辑是将整个视频流切分为多个小的 TS(MPEG-TS)片段,并通过 `.m3u8` 索引文件进行管理。客户端根据 `.m3u8` 文件动态加载并播放这些片段,实现流畅的视频播放体验。 HLS 的播放逻辑规则如下: - **分片加载**:视频流被分割为多个小的 TS 片段(通常为 2-10 秒),并通过 `.m3u8` 索引文件列出这些片段的 URL。 - **自适应码率**:HLS 支持多码率版本,播放器会根据网络状况自动选择合适的码率,确保播放流畅性。 - **动态更新**:在直播场景中,`.m3u8` 文件会不断更新,添加新的 TS 片段链接,播放器持续加载最新内容。 - **缓存机制**:播放器会缓存一定数量的 TS 片段,以应对网络波动和延迟[^3]。 ```javascript // 使用 hls.js 播放 HLS 视频的基本逻辑 if (Hls.isSupported()) { const hls = new Hls(); hls.loadSource('https://example.com/stream.m3u8'); hls.attachMedia(videoElement); hls.on(Hls.Events.MANIFEST_PARSED, () => videoElement.play()); } ``` ### 浏览器对 HLS 的最大并发请求浏览器对同一域名下的并发请求数量有限制,通常为 6 个左右。这一限制适用于所有基于 HTTP请求,包括 HLS 的 `.m3u8` 和 `.ts` 文件加载。当多个 HLS 视频流同时加载时,可能会因并发请求过多导致加载延迟或失败。 - **单域名限制**:Chrome 等主流浏览器对同一域名的并发连接数限制为 6 个,这意味着如果页面中有超过 6 个 HLS 视频流,部分流可能无法加载[^1]。 - **跨域资源加载**:通过使用多个子域名(如 `video1.example.com`、`video2.example.com`)或不同端口,可以绕过单域名并发限制,提升 HLS 流的加载效率。 - **HTTP/2 支持**:若服务器支持 HTTP/2 协议,可以有效提升并发请求能力,减少请求排队问题[^5]。 ### 相关优化策略 为了提升 HLS 多路播放的性能,可以采取以下策略: - **使用 CDN 分发**:通过 CDN 将 HLS 流分发到多个边缘节点,避免单点带宽瓶颈。 - **动态加载与释放**:在 Vue 等前端框架中,可以使用 `v-if` 控制组件渲染,仅加载当前可见的视频流,避免资源浪费。 - **播放器资源管理**:通过 `hls.js` 提供的 API 控制 HLS 实例的加载状态,如 `hls.stopLoad()` 和 `hls.startLoad()`,实现按需加载。 - **硬件加速**:在 `<video>` 标签中添加 `playsinline` 和 `webkit-playsinline` 属性,启用硬件解码,提升播放性能。 --- ###
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值