Node.js调用Riot外部API时随机停滞1分钟的原因排查
排查思路与建议
针对你遇到的Fastify服务器调用Riot API时随机出现1分钟请求停滞的问题,结合你已完成的排查动作,给出以下具体方向:
1. 拆分性能测量,定位停滞阶段
把请求全链路的耗时拆解开,明确是DNS解析、TCP连接建立,还是请求发送后的响应等待阶段出现了延迟:
const dns = require('dns').promises; // 测量DNS解析耗时 performance.mark('dns-start'); await dns.resolve('europe.api.riotgames.com'); performance.mark('dns-end'); console.log('DNS解析耗时:', performance.measure('dns', 'dns-start', 'dns-end').duration); // 测量请求本身耗时 performance.mark('request-start'); const matchDataResponse = await axios.get( `https://europe.api.riotgames.com/tft/match/v1/matches/${matchId}` ); performance.mark('request-end'); const reqDuration = performance.measure('request', 'request-start', 'request-end').duration; if (reqDuration > 5000) { console.log('请求耗时:', reqDuration); }
如果DNS解析耗时正常,问题大概率出在TCP连接或API响应阶段。
2. 调整HTTP客户端连接池配置
Node.js内置的http/https模块默认每个主机仅允许5个并发连接,若服务并发请求超过该限制,新请求会排队等待可用连接,可能恰好导致1分钟停滞。可以修改Axios的连接池参数:
const https = require('https'); const keepAliveAgent = new https.Agent({ maxSockets: 20, // 增大并发连接数 keepAlive: true, // 启用连接复用 keepAliveMsecs: 30000 }); // 请求时指定自定义Agent const matchDataResponse = await axios.get( `https://europe.api.riotgames.com/tft/match/v1/matches/${matchId}`, { httpsAgent: keepAliveAgent } );
3. 抓包分析全链路请求
用tcpdump或Wireshark抓取慢请求的网络包,确认:
- 请求是否及时发送到Riot API服务器
- 服务器是否在1分钟后才返回响应
- 是否存在TCP重传、连接超时或握手失败的情况
若抓包显示请求发送后长时间无响应,说明问题出在Riot API端或中间网络;若请求未及时发送,则是自身客户端或网络配置问题。
4. 排查DNS解析异常
随机延迟可能和DNS解析不稳定有关,可尝试:
- 手动指定可靠的DNS服务器(如8.8.8.8)进行测试
- 在代码中添加DNS缓存逻辑,避免重复解析域名
5. 检查中间件/拦截器的影响
即使是无关功能的改动,也需确认新增的Fastify插件、Axios拦截器是否意外引入延迟逻辑(比如错误的重试机制、超时等待)。可以临时禁用近期新增的中间件,观察问题是否消失。
6. 验证Riot API端点状态
- 切换到Riot其他区域的API端点(如
na1.api.riotgames.com)测试请求耗时,若其他区域正常,则说明欧洲节点存在局部故障 - 再次核对Riot开发者平台的状态公告,部分边缘节点故障可能未在全局状态页显示
7. 排查操作系统网络限制
检查服务器的网络资源限制:
- 用
ss -s查看TCP连接状态,确认是否存在大量TIME_WAIT或CLOSE_WAIT连接占用资源 - 检查系统文件描述符上限(
ulimit -n),若过低可能导致无法建立新连接
内容的提问来源于stack exchange,提问作者Tomek Słoma
相关产品推荐
相关产品推荐

