首页 > 解决方案 > Node.js 每 10 秒 10000 个并发 HTTP 请求

问题描述

我有一个用例,我需要每 10 秒在无限循环中发出超过 10,000 个外部 HTTP 请求(对一个 API)。这个 API 需要 200-800 毫秒的响应时间。

目标

  1. 10秒内调用外部API超过10000次
  2. 拥有一个可以一次运行数月而不会失败的防故障轮询系统

尝试:我尝试使用Async库并将请求限制为 300 个并发调用(更高的数字很快失败)但是在大约 300,000 个请求之后我遇到了错误,我收到连接被拒绝(我在另一个端口上调用本地节点服务器) . 我正在运行本地服务器来模拟真实的 API,因为我们的应用程序尚未扩展到超过 10,000 个用户,并且外部 API 每个请求需要 1 个唯一用户。本地响应服务器是一个非常简单的 Node 服务器,它有一个等待 200-800 毫秒响应的路由。

我收到此错误是因为我正在调用在我的机器上本地运行的服务器,还是因为 Node 在处理这么多请求时遇到问题?任何有关执行此类轮询的最佳方式的见解将不胜感激。

编辑:我的问题是关于如何创建一个可以在 10 秒间隔内发送超过 10,000 个请求的客户端。

编辑2:客户:

//arr contains 10,000 tokens
const makeRequests = arr => {
  setInterval(() => {
    async.eachLimit(arr, 300, (token, cb) => {
      axios.get(`http://localhost:3001/tokens/${token}`)
        .then(res => {
          //do something
          cb();
        })
        .catch(err => {
          //handle error
          cb();
        })
    })
  }, 10000);
}

虚拟服务器:

const getRandomArbitrary = (min, max) => {
  return Math.random() * (max - min) + min;
}

app.get('/tokens:token', (req, res) => {
  setTimeout(() => {
    res.send('OK');
  }, getRandomArbitrary(200, 800))
});

标签: node.jshttpconcurrencypollinglong-polling

解决方案


推荐阅读