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验证。
- 检查中间代理/负载均衡器的连接数限制、超时设置,确认是否存在瓶颈。
- 在Next.js服务器上用
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
相关产品推荐
相关产品推荐

