如何在 node.js 中加速多个请求?

问题描述

我有一个代码,它基本上可以检查一堆网站是否正常运行。

const request = require('request');
const urls = [];

var start = Date.Now();
var count = 1;
var countUrls = urls.length;

var up= 0
var down = 0;

function callback(start) {
    console.log((Date.Now() - start) + 'ms execution.');
    console.log('\n Up: ' + up + ' Down: ' + down);
    process.exit()
}

urls.forEach( function(url) {
    var options = {
    url: url,timeout: 10000
    };

    request(options,function (error,response,body) {
        if(error) {
            console.error(count + ': ' + url + ' is down: ' + error);
            count++;
            down++;
        } else {
            console.log(count + ': ' + url + ' is up: ');
            count++;
            up++;
        }

        if((count - 1) == countUrls) {
            callback(start);
        }
    });
});

它工作得很好。在我的 urls 数组中,我有 120 个 URL。当我运行此代码时,它会在 20-30 秒内自行执行。但是如果我将 o URLs 的数量增加到 720,执行时间会增加到 1 分 30 秒。

我想了解两件事;

1- 超时设置为 10 秒。即使有 120 个网址,它怎么能超越这个范围?

2- 此代码不需要良好的硬件,它只是连接到网站。我能做些什么来加快速度?我想在 1 分钟内检查大量的 URL(可能是 100k),因为我的代码每分钟都会运行一次。

仅供参考,此代码在我的本地机器上运行,我有 24 MBPS 的互联网连接。这可能是问题所在,但大多数服务器都有 1 GBPS 的互联网连接,当我比较 24 - 1 和 120 - 100k 时,我觉得这还不够。

解决方法

您可以尝试使用 Promise.all(),它将并行启动所有请求(而不是您当前正在执行的顺序操作)。

Promise.all([promise1,promise2,promise3]).then((values) => {
  console.log(values);
});

数组中的每个元素都对应于您网站的 URL(或至少是请求)。

您可能会在并行启动 100,000 个请求时遇到问题 - 但之后只需编写代码即可。

如果其中一个失败,您自然需要考虑错误处理,但简而言之,这就是您需要关注的。