我正在构建一个应用程序,它将对远程api服务器进行大约一百万次调用。我可以将连接数量限制为例如10个吗?我可以将最大套接字数设置为10吗?
我试图了解这些参数的作用:
keepAlive: false, maxSockets: 999, maxFreeSockets: 1
在节点http get函数中,以下代码:
var inputData = []; for(i=1; i<=5000;i++){ inputData.push('number' + i); } var options = { host: "localhost", port: 80, path: "/text.txt", keepAlive: false, maxSockets: 999, maxFreeSockets: 1 } var limit = inputData.length; var counter = 0; function fetchData(number){ return new Promise(function(resolve, reject){ var http = require('http'); fetch = function(resp){ var body = ''; resp.on('data',function(chunk){ body += chunk; }) resp.on('end',function(){ console.log(resp) resolve() }) resp.on('error',function(err){ console.log('error'); }) } var req = http.request(options, fetch); req.end(); }) } Promise.all(inputData.map(number => fetchData(number))).then(function(results) { console.log('finished'); connection.end(); }) .catch(function(error) { console.log('there wa an error'); console.log(error); });
您确实不希望触发1,000,000个请求,并且以某种方式希望maxSockets一次将其管理到100个。有很多原因说明那不是做事情的好方法。相反,您应该使用自己的代码来将实时连接数一次管理到100。
有很多方法可以做到这一点:
编写自己的代码,该代码可以激发100,然后每次完成一个,就会激发下一个。
使用Bluebird Promise.map()具有内置的并发功能,该功能将同时管理飞行中的飞机数量。
Promise.map()
使用async.mapLimit()具有内置并发功能的Async ,该功能将同时管理飞行中的飞机数量。
async.mapLimit()
至于自己编写代码来做到这一点,您可以这样做。
function fetchAll() { var start = 1; var end = 1000000; var concurrentMax = 100; var concurrentCnt = 0; var cntr = start; return new Promise(function(resolve, reject) { // start up requests until the max concurrent requests are going function run() { while (cntr < end && concurrentCnt < concurrentMax) { ++concurrentCnt; fetchData(cntr++).then(function() { --concurrentCnt; run(); }, function(err) { --concurrentCnt; // decide what to do with error here // to continue processing more requests, call run() here // to stop processing more requests, call reject(err) here }); } if (cntr >= end && concurrentCnt === 0) { // all requests are done here resolve(); } } run(); }); }