JS 实现请求调度器
前言:JS天然支持并行请求,但与此同时会带来一些问题,比如会造成目标服务器压力过大,所以本文引入“请求调度器”来节制并发度。
TLDR;直接跳转『抽象和复用』章节。
为了获取一批互不依赖的资源,通常从性能考虑可以用Promise.all(arrayOfPromises)来并发执行。比如我们已有100个应用的id,需求是聚合所有应用的PV,我们通常会这么写:
constids=[1001,1002,1003,1004,1005]; consturlPrefix='http://opensearch.example.com/api/apps'; //fetch函数发送HTTP请求,返回Promise constappPromises=ids.map(id=>`${urlPrefix}/${id}`).map(fetch); Promise.all(appPromises) //通过reduce做累加 .then(apps=>apps.reduce((initial,current)=>initial+current.pv,0)) .catch((error)=>console.log(error));
上面的代码在应用个数不多的情况下,可以运行正常。当应用个数达到成千上万时,对支持并发数不是很好的系统,你的「压测」会把第三放服务器搞挂,暂时无法响应请求:
502BadGateway 502BadGateway
nginx/1.10.1