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

一、先上结论:

①同一域名下,同一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));

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

可以看到从第一个请求pending开始,后面的请求都是pending状态。随着前一个请求的响应结束,后面的请求陆续也得到了响应。各个请求的响应时间如下图:CHROME浏览器发送HTTP最大请求并发数限制

比较奇怪的是,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));

结果:

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

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

③POST请求

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

结果:

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

和②的结果一致,6个请求一批,非常规律。CHROME浏览器发送HTTP最大请求并发数限制

④补充一种情况(同①)

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

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

上一篇:封装单次请求 重复出现问题


下一篇:React循环链表结构js实现