将数千个并发的https请求划分为Nodejs

时间:2016-12-27 04:29:05

标签: javascript node.js concurrency

我正在开发一个可以进行数千次并发https调用的项目。 我的第一个问题是:并存限制在哪里?可以同时拨打多少电话?它取决于什么? 其次,我在ubuntu系统上工作,在大多数情况下,由于请求太多,系统挂起。如何将这些数千个并发请求一次分成50或100个请求的块,并在完成这些请求后,调用下一组请求。

我的代码如下:

items.forEach(function(item) {
        request().then(function() {
            if(counter == items.length) {
                deferred.resolve("Success");
                return deferred.promise;
            }
        })
        .catch(function(err) {
            deferred.reject(err);
        });
        counter++;
    });

Items数组大多超过10k。

2 个答案:

答案 0 :(得分:2)

您可以在bluebird中使用Promise.map并发选项

var Promise = require("bluebird");
var join = Promise.join;
var fs = Promise.promisifyAll(require("fs"));
var concurrency = parseFloat(process.argv[2] || "Infinity");
console.time("reading files");
fs.readdirAsync(".").map(function(fileName) {
    var stat = fs.statAsync(fileName);
    var contents = fs.readFileAsync(fileName).catch(function ignore() {});
    return join(stat, contents, function(stat, contents) {
        return {
            stat: stat,
            fileName: fileName,
            contents: contents
        }
    });
// The return value of .map is a promise that is fulfilled with an array of the mapped values
// That means we only get here after all the files have been statted and their contents read
// into memory. If you need to do more operations per file, they should be chained in the map
// callback for concurrency.
}, {concurrency: concurrency}).call("sort", function(a, b) {
    return a.fileName.localeCompare(b.fileName);
}).then(function() {
    console.timeEnd("reading files");
});

答案 1 :(得分:1)

并发限制在哪里?

首先,您的所有请求将进入event loop,然后逐个进入callstack。所以没有实际限制,当callstack开始填充越来越多的项目时,它将开始吃你的RAM。

可以同时进行多少次通话?

您可以使用系列和并行模型 -

您可以在一个插槽中发送50(任意号码)请求,然后在另一个插槽中发送,等等。

要进行系列和并行请求,您可以分别使用async seriesasync parallel

取决于什么?

观看我在第一个回答中提到的链接。