You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NextJS中Axios Get请求高负载时响应过慢排查求助

Next.js getInitialProps 高延迟+内存增长排查思路

1. 版本兼容性排查

  • Node 10已停止维护,存在异步处理、内存管理的已知缺陷,Next.js 10虽标注支持Node 10,但高负载下易出现事件循环阻塞。先升级Node.js至LTS版本(如14.x/16.x,Next.js 10兼容至Node 16),验证问题是否缓解。
  • 查阅Next.js 10官方Issue,确认getInitialProps在高负载下是否存在内存泄漏、请求排队等已知问题,查看是否有官方补丁或替代方案。

2. Axios请求并发与拦截器优化

  • 默认Axios无并发请求限制,7req/s负载下服务端会发起大量并发请求,易耗尽Node.js socket连接池,导致请求排队。给Axios配置连接池:
    const axios = require('axios');
    const http = require('http');
    const https = require('https');
    
    const axiosInstance = axios.create({
      httpAgent: new http.Agent({ keepAlive: true, maxSockets: 10 }),
      httpsAgent: new https.Agent({ keepAlive: true, maxSockets: 10 })
    });
    
  • 检查Axios拦截器是否存在同步耗时操作(如大量字符串拼接、同步日志写入),这类操作会阻塞事件循环。将日志改为异步写入,或降低日志输出频率。

3. 服务端渲染资源竞争与内存泄漏排查

  • getInitialProps在服务端每个请求拥有独立执行上下文,但如果使用全局共享资源(如未正确释放的连接、全局变量),会引发资源竞争和内存泄漏。检查代码中是否存在未清理的定时器、事件监听,或全局Axios实例是否存在泄漏。
  • 使用Node.js --inspect参数启动Next.js,通过Chrome DevTools的Memory面板录制负载前后的内存快照,对比分析泄漏对象类型(如未释放的Promise、请求实例)。

4. 网络链路隐藏延迟排查

  • 虽然Django后端响应仅几毫秒,但需确认Next.js与Django服务器间的链路状态:
    • 在Next.js服务器上用curl高负载测试Django API的响应时间,排除DNS解析慢、TCP握手延迟、数据包丢失等问题。
    • Node 10对HTTP/2支持不完善,若启用HTTP/2可能导致多路复用失效,引发请求排队,可暂时切换为HTTP/1.1验证。
    • 检查中间代理/负载均衡器的连接数限制、超时设置,确认是否存在瓶颈。

5. 缓存与渲染策略优化

  • getInitialProps默认无请求结果缓存,每个请求都会重复调用API。考虑替换为getServerSideProps(Next.js 10支持),结合缓存策略减少请求量:
    • 对非实时数据使用内存缓存(如lru-cache)缓存API响应:
      const LRU = require('lru-cache');
      const apiCache = new LRU({ max: 100, ttl: 60000 });
      
      export async function getInitialProps(ctx) {
        const cacheKey = 'django-api-response';
        let responseData = apiCache.get(cacheKey);
        if (!responseData) {
          const res = await axiosInstance.get('YOUR_DJANGO_API_URL');
          responseData = res.data;
          apiCache.set(cacheKey, responseData);
        }
        return { data: responseData };
      }
      
  • 若数据更新频率低,可改用getStaticProps+revalidate实现增量静态生成,彻底减少服务端API调用。

6. 事件循环阻塞分析

  • 使用clinic bubbleprof工具定位阻塞事件循环的同步代码:
    • 安装工具:npm install -g clinic
    • 启动Next.js:clinic bubbleprof -- node server.js
    • 模拟7req/s负载(如用artillery:artillery quick --count 100 --num 7 http://YOUR_NEXTJS_URL)
    • 生成分析报告,排查是否存在耗时同步操作(如大JSON解析、同步文件读写)。

内容的提问来源于stack exchange,提问作者Mani Kumar Reddy Kancharla

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 19:45:50