一、先上结论:
①同一域名下,同一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应用的时候,也不会进行这种操作,所以不知道是否有其他开发手段有同样的效果。
①的情况确实比较意外,阻塞就阻塞吧,突然又开始并发了,待确认如果有了解的大佬,望指点迷津,不甚感激