在开发调试websocket的时候,去浏览器模拟了ws请求,测试服务器请求量,发现只有255个成功,之后所有请求全部失败,经各种考证发现,不是服务器问题,而是浏览器最大并发请求量为256。
测试请求代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>WEBSOCKET测试页面</title>
</head>
<body>
<article id="info">
</article>
</body>
<script>
let tick = [];let errorNumber=0;tickNumber=200;
let el = document.querySelector("#info");
let state = []
let store = {"message":"","db":[]};
Object.defineProperty(store,"message",{
set(value){
store.db.push({
time:new Date(),message:value
});
let txt
txt+= store.db.map(d=>"<p>"+d.message+"</p>").join(" ");
el.innerHTML=txt;
}
})
function ws(){
const name="浔阳江头夜送客枫叶荻花秋瑟瑟主人下马客在船举酒欲饮无管弦醉不成欢惨将别别时茫茫江浸月忽闻水上琵琶声主人忘归客不发寻声暗问弹者谁琵琶声停欲语迟移船相近邀相见添酒回灯重开宴千呼万唤始出来犹抱琵琶半遮面转轴拨弦三两声未成曲调先有情弦弦掩抑声声思似诉平生不得志低眉信手续续弹说尽心中无限事轻拢慢捻抹复挑初为霓裳后六幺大弦嘈嘈如急雨小弦切切如私语嘈嘈切切错杂弹大珠小珠落玉盘间关莺语花底滑幽咽泉流冰下难冰泉冷涩弦凝绝凝绝不通声暂歇别有幽愁暗恨生此时无声胜有声银瓶乍破水浆迸铁骑突出刀枪鸣曲终收拨当心画四弦一声如裂帛东船西舫悄无言唯见江心秋月白"
let n = name.substr(Math.floor(Math.random()*name.length),2);
let id = this.v1(); tick.push(id);
let num = Math.floor(Math.random()*tick.length);
let toid = tick[num];
let url = `ws://127.0.0.1:8000/?id=${id}&name=${n}&gid=00001`;
let w = new WebSocket(url);
debugger
let th = this;
w.addEventListener("message",function(d){
store.message="收到消息<----"+d.data
},false);
w.addEventListener("open",function(d){
w.send(`{"code":400,"data":"${n}:你好","toid":"${toid}","fromid":"${id}","publish":"0"}`)
store.message="发送消息----->"+id+"-----"+toid;
proxy.successNumber+=1;
},false);
w.addEventListener("close",function(e){
store.message = id+"关闭";
errorNumber+=1;
},false);
w.addEventListener("error",function(e){
store.message=id+"报错"; console.log(e);
proxy.errorNumber+=1;
},false);
}
ws.prototype.v1=function(){
return parseInt(Math.random()*0x10000).toString(16)+"-"+parseInt(Math.random()*0x10000).toString(16)+"-"+parseInt(Math.random()*0x10000).toString(16)+"-"+parseInt(Math.random()*0x10000).toString(16)
}
let els = document.createElement("div");
Object.assign(els.style,{
position:"fixed",
top:0,
right:0,
ZIndex:100,
fontSize:"20px",
color:"#c00"
})
document.body.appendChild(els);
let proxy = new Proxy({errorNumber:0,successNumber:0},{
set(target,key,val){
els.innerHTML = `成功${proxy.successNumber}-失败:${proxy.errorNumber}`
return target[key]=val;
}
})
for(var i=0,f=0;i<tickNumber;i++){
setTimeout(function(){
new ws();
})
}
</script>
</html>
调试发现发起2000个请求后报错,提示并发量太大,于是翻阅nodejs 查看关于所有请求线程并发相关内容,发现http.request() 使用的默认 http.globalAgent 的选项均为各自的默认值
- keepAlive <boolean>: 保持 socket 可用即使没有请求,以便它们可被将来的请求使用而无需重新建立一个 TCP 连接。默认为 false。
- keepAliveMsecs <number> :当使用了 keepAlive 选项时,该选项指定 TCP Keep-Alive 数据包的 初始延迟。 当 keepAlive 选项为 false 或 undefined 时,该选项无效。 默认为 1000。
- maxSockets <number> 每个主机允许的最大 socket 数量。 默认为 Infinity。
- maxFreeSockets <number> 在空闲状态下允许打开的最大 socket 数量。 仅当 keepAlive 为 true 时才有效。 默认为 256
但是并没有为koa开启keepAlive 所以不会是原始globalAgent 的问题,使用多浏览器请求,每次200个是可以的,服务端线程池也没有报错,所以判断是浏览器限制每次并发请求不能大于256个线程。
网友评论