编写项目中,使用到 axios
请求页面内容。项目刚启动时,一切运行良好,但当长时间运行,大约数小时后, axios
的 get
请求需要数秒才能有响应
初步排查
项目类似爬虫脚本,每秒会发起大量的请求,且不能保证目标域名和 ip 一致。部分地方更换 fetch
发现使用 fetch 一切正常,长时间运行正常。
但是发现 fetch 在某些地方还是有某些问题。
于是继续排查。网络上无法查找到类似的问题解答,也几乎没人遇到这个问题?
keepAlive 导致的问题
keepAlive
是用来与服务器保持长连接的功能,默认是开启的。它与服务器建立长连接,避免访问同一服务器时,频繁建立 tcp 连接。
keepAlive 本意上是加快访问的功能
如果 axios
每次访问的服务器、域名、ip不一致,那么尽量关闭此选项,如果短时间大量请求不同的ip,也许会创建大量的连接导致某些问题
axios
关闭 keepAlive
后,就没有长时间运行后,响应缓慢的问题。
axios 关闭 keepAlive 方法
// 首先导入模块
const http = require('http');
const https = require('https');
const axios = require('axios');
// 构建 agent,然后指定 httpAgent 即可关闭
const agent = new http.Agent({keepAlive: false});
const agents = new https.Agent({keepAlive: false});
axios.defaults.httpAgent = agent;
axios.defaults.httpsAgent = agents;
axios.defaults.keepAlive = false; // 关闭连接复用
axios.defaults.httpAgent
和 axios.defaults.httpsAgent
分别对应 http
和 https
,要分别指定才行