为何请求频率越高、持续越久,axios响应越慢?
响应时间随请求量增长变慢的原因及修复方案
核心问题定位
你的代码存在一个致命性能隐患:每次调用method函数时,都会重复执行axiosRetry(axios, { ... })。axiosRetry的作用是给axios实例添加重试拦截器,每次调用都会新增一套重试逻辑到全局axios实例上。随着请求次数增多,axios的请求/响应拦截器会不断堆积,每个请求都要经过越来越多的拦截器处理,直接导致响应时间逐渐变长——高并发场景下(比如30请求/秒)这个问题会被快速放大。
修复方案
将axiosRetry的初始化代码移到函数外部,仅执行一次即可,无需每次请求都重复配置:
const httpsAgent = new https.Agent({ keepAlive: true }) const axiosRetry = require('axios-retry') const axios = require('axios') // 全局仅初始化一次axios重试逻辑 axiosRetry(axios, { retries: 3, retryDelay: () => 5000, retryCondition: (error) => { // 用可选链避免无响应时抛出异常 return error.response?.status === 503; } }) const method = async (URL, request, headers) => { const now = Date.now() console.time('axios call ' + now) try { await axios.post(URL, request, { headers, timeout: 60000, httpsAgent }) } catch (err) { // 添加错误捕获,避免未处理的Promise rejection console.error('请求失败:', err) throw err } finally { console.timeEnd('axios call ' + now) } }
额外优化建议
- 增强错误处理:原代码未捕获请求可能抛出的超时、网络错误等异常,添加
try/catch可避免进程异常,同时便于排查问题。 - 避免全局axios污染:如果项目中其他地方也使用axios,全局修改实例可能影响其他请求。建议创建独立axios实例单独配置重试逻辑:
// 创建独立axios实例,仅用于当前请求场景 const customAxios = axios.create({ httpsAgent, timeout: 60000 }) // 给独立实例配置重试 axiosRetry(customAxios, { retries: 3, retryDelay: () => 5000, retryCondition: (error) => error.response?.status === 503 }) const method = async (URL, request, headers) => { const now = Date.now() console.time('axios call ' + now) try { await customAxios.post(URL, request, { headers }) } catch (err) { console.error('请求失败:', err) throw err } finally { console.timeEnd('axios call ' + now) } }
验证方式
修改完成后,用artillery以30请求/秒的频率压测,观察响应时间是否恢复稳定(与直接调用目标URL的表现一致)。
内容的提问来源于stack exchange,提问作者Yuan
相关产品推荐
相关产品推荐

