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

Node.js能否突破setInterval最小间隔限制,加速批量HTTPS请求?

优化Node.js批量HTTPS请求速度方案

你的核心问题在于用setInterval的方式控制请求节奏完全不合理——Node.js的事件循环机制决定了setInterval(1ms)的实际执行间隔远大于1ms,而且不管前一个请求是否完成都会触发新请求,导致大量请求堆积排队,反而拖慢整体效率。下面是直接有效的优化方案:

问题根源拆解

  1. setInterval的误区:JavaScript事件循环每轮至少需要几毫秒处理,1ms的间隔根本无法达到,而且异步请求的回调会在队列中积压,实际并发数完全失控。
  2. request库已废弃:这个库多年未维护,性能和稳定性远不如现代HTTP库。
  3. 无并发控制:无限制发送请求会触发目标网站限流,同时耗尽本地CPU/网络资源。

优化方案(用并发控制替代定时循环)

方案1:用axios+p-limit实现可控并发

这是最简洁的实现方式,通过第三方库快速控制并发数:

首先安装依赖:

npm install axios p-limit

替换后的代码:

const axios = require('axios');
const fs = require('fs');
const pLimit = require('p-limit');

// 读取并清理ID列表(过滤空行)
const ids = fs.readFileSync('./list.txt', 'utf-8')
  .split('\n')
  .map(id => id.trim())
  .filter(id => id);

// 控制并发数(根据目标网站承受能力调整,建议从20开始测试)
const concurrentLimit = pLimit(50);

let completedCount = 0;

// 生成带并发限制的请求任务
const requestTasks = ids.map(id => concurrentLimit(async () => {
  try {
    const res = await axios.get(`https://websitethingy.com/endpoint/${id}`, {
      headers: {
        "User-Agent": "Android/126021",
        "Authorization": "auth_token"
      }
    });
    console.log(res.data);
  } catch (err) {
    if (err.response?.status === 404) {
      console.log("not found", id);
    } else {
      console.error(`请求ID ${id}失败:`, err.message);
    }
  } finally {
    completedCount++;
    process.title = `[已完成请求: ${completedCount}]`;
  }
}));

// 批量执行所有请求
(async () => {
  await Promise.allSettled(requestTasks);
  console.log('所有请求处理完成');
})();

方案2:原生https模块实现(无第三方依赖)

如果不想用第三方库,可以用Node.js原生模块实现并发控制:

const https = require('https');
const fs = require('fs');

const ids = fs.readFileSync('./list.txt', 'utf-8')
  .split('\n')
  .map(id => id.trim())
  .filter(id => id);

const concurrentLimit = 50; // 并发数
let activeRequests = 0;
let currentIndex = 0;
let completedCount = 0;

function sendNextRequest() {
  if (currentIndex >= ids.length) {
    if (activeRequests === 0) {
      console.log('所有请求处理完成');
    }
    return;
  }

  const id = ids[currentIndex];
  currentIndex++;
  activeRequests++;

  const options = {
    hostname: 'websitethingy.com',
    path: `/endpoint/${id}`,
    headers: {
      "User-Agent": "Android/126021",
      "Authorization": "auth_token"
    }
  };

  const req = https.get(options, (res) => {
    let body = '';
    res.on('data', chunk => body += chunk);
    res.on('end', () => {
      if (res.statusCode === 404) {
        console.log("not found", id);
      }
      console.log(body);
      completeRequest();
    });
  });

  req.on('error', (err) => {
    console.error(`请求ID ${id}失败:`, err.message);
    completeRequest();
  });

  function completeRequest() {
    activeRequests--;
    completedCount++;
    process.title = `[已完成请求: ${completedCount}]`;
    sendNextRequest();
  }
}

// 启动初始并发请求
for (let i = 0; i < concurrentLimit; i++) {
  sendNextRequest();
}

关键优化点说明

  1. 并发数控制:根据目标网站的反爬策略和服务器性能调整并发数(比如从20逐步往上加,找到最快且不被封禁的数值)。
  2. 异步流程优化:用async/await或Promise替代回调,避免回调地狱,同时确保请求完成后再启动新请求,避免堆积。
  3. 无效请求过滤:提前过滤空行ID,减少无效请求。
  4. 资源复用:现代HTTP库和原生模块都会自动复用TCP连接,减少握手开销。

额外提速建议

  • 启用HTTP/2:如果目标网站支持,用axios配合HTTP/2客户端,可大幅提升并发性能。
  • 本地DNS缓存:避免每次请求重复解析域名,可通过系统或第三方库实现。
  • 避免同步阻塞:如果ID列表文件极大,改用流式读取(fs.createReadStream),避免一次性加载占用内存。

内容的提问来源于stack exchange,提问作者kade

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 07:23:18