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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 04:15:02