Node.js Express.js 场景下如何并行处理数组对应微服务请求 降低耗时
回答
你当前使用的Promise.all代码本身已经是并行执行所有请求的实现,已经通过并行的方式做了耗时优化:
遍历ids数组调用this._getData(id)时,每个请求会被立刻触发,所有请求同时执行,总耗时等于耗时最长的单个请求的耗时,远低于串行执行时所有请求耗时相加的总耗时。
如果当前流程耗时仍然不符合预期,可从以下方向针对性优化:
- 优先排查下游微服务的单请求响应速度,如果单请求本身耗时过高,优化下游接口的处理逻辑是收益最高的方案
- 如果ID数组长度很大,同时发起的请求数过多触发了下游服务的限流规则,导致请求排队甚至超时,可以改用限制并发数的分批并行方案,控制同时发起的请求数量,示例代码如下:
// 自定义分批请求方法,concurrency参数为最大同时发起的请求数 async function runBatchRequest(ids, concurrency = 3) { const result = [] for (let i = 0; i < ids.length; i += concurrency) { // 切割出当前批次的ID const currentBatch = ids.slice(i, i + concurrency) // 并行执行当前批次的所有请求 const batchRes = await Promise.all(currentBatch.map(id => this._getData(id))) result.push(...batchRes) } return result } // 调用示例,设置最大并发数为2 const ids = [1,2,3,4] const objects = await runBatchRequest(ids, 2)
- 存在大量重复ID的场景,可以新增本地缓存,同一个ID只发送一次请求,后续直接复用缓存结果,避免重复请求带来的额外耗时。
- 网络层面耗时过高的场景,可以检查服务部署位置,尽量让请求在同可用区/同地域内发起,降低网络传输耗时。
内容的提问来源于stack exchange,提问作者Mateusz Sobczak
相关产品推荐
相关产品推荐

