Node.js中如何让HTTP Agent预先建立并维护指定域名的最低空闲TCP连接
agent.createConnection() 就是你需要的方法,它可以直接创建符合Agent配置的TCP/TLS连接,不需要发送无意义的HTTP请求,也不会产生多余的请求开销。
你当前用预发无用请求的方案虽然可用,但存在三个明显缺点:
- 会产生无效请求流量,给目标服务端带去不必要的负载
- 如果目标接口配置了鉴权、限流规则,可能会触发拦截
- 需要等待完整的HTTP请求响应流程,多了不必要的RTT耗时,预连接效率更低
使用agent.createConnection()仅需要完成TCP握手+TLS握手,就可以把连接放入Agent的空闲连接池供后续请求复用,不会产生HTTP层面的开销,是更标准的预建连接实现方式。
实现示例
const https = require("https"); // 你原有的全局Agent配置,可根据需要调整maxFreeSockets、超时等参数 global.httpsAgent = new https.Agent({ keepAlive: true, maxSockets: 64, // 全局最大并发连接数 maxFreeSockets: 16, // 最大空闲连接数,不能低于你要维持的最低空闲连接数 timeout: 60000 // 空闲连接超时时间 }); /** * 预创建指定数量的空闲HTTPS连接到目标域名 * @param {string} host 目标域名,如 example.com * @param {number} port 目标端口,HTTPS默认443 * @param {number} minConnNum 要维持的最低空闲连接数 */ async function maintainMinIdleConnections(host, port = 443, minConnNum) { // 先查询当前对应域名的空闲连接数,避免重复创建 const freeSocketKey = `${host}:${port}:${host}`; // 空闲池key格式为 host:port:servername const currentFreeConnNum = global.httpsAgent.freeSockets[freeSocketKey]?.length || 0; const needCreateNum = minConnNum - currentFreeConnNum; if (needCreateNum <= 0) return; const createTasks = []; for (let i = 0; i < needCreateNum; i++) { createTasks.push(new Promise((resolve, reject) => { // 创建TLS连接(HTTPS使用TLS套接字) const socket = global.httpsAgent.createConnection({ host, port, servername: host, // 适配SNI场景,必填 rejectUnauthorized: true // 保持默认HTTPS证书校验逻辑 }, (err, conn) => { if (err) return reject(err); // 连接创建完成后手动加入Agent空闲连接池,options参数要和后续请求参数完全匹配才能被正确复用 global.httpsAgent.freeSocket(conn, { host, port, servername: host, protocol: "https:" }); resolve(); }); socket.on("error", reject); })); } return Promise.allSettled(createTasks); } // 应用启动时调用,预建5个到example.com的空闲连接 maintainMinIdleConnections("example.com", 443, 5) .then(res => { const successCount = res.filter(item => item.status === "fulfilled").length; console.log(`预建连接完成,成功${successCount}个`); }); // 如果需要持续维持最低空闲连接数,可以加个定时器定时检查补充 setInterval(() => { maintainMinIdleConnections("example.com", 443, 5); }, 30000); // 每30秒检查一次
注意事项
- Agent会自动清理服务端主动断开的失效空闲连接,你不需要手动处理失效连接的清理逻辑
- 配置的
maxFreeSockets参数必须大于等于你要维持的最低空闲连接数,否则超过上限的空闲连接会被Agent自动销毁 - 调用
freeSocket时传入的options参数必须和你后续发起请求时的参数完全一致,否则Agent无法匹配到对应的空闲连接
内容的提问来源于stack exchange,提问作者Shiva T. Kota
相关产品推荐
相关产品推荐

