这是我的第一个nodejs应用程序。我正在尝试使用一些外部API来执行cronjob并对响应进行一些计算。
一切正常,直到curlList变大。 在curlList中有10个项目,但是我有一个很大的curlList超过90个项目。
执行此实施的最佳方式是什么。
感谢您的帮助。
祝你好运, 约翰尼
var request = require('request');
var curlList = [{
id: 1,
href: '/name1'
}, {
id: 2,
href: '/name2'
}, {
id: 3,
href: '/name3'
}];
var curl = function(id, url) {
var payload = {
id: id
};
var options = {
method: 'post',
body: payload,
json: true,
url: ""
}
request(options, function(err, res, body) {
if (err) {
console.log(err, 'error posting json')
return
}
//Calculate response data
//If match
if (match) {
console.log(url);
}
});
};
app.listen(3000, function() {
for (var i = 0; i < curlList.length; i++) {
var href = list[i].href;
var id = list[i].id;
curl(id, href);
}
});
答案 0 :(得分:1)
您的for
循环在几微秒内启动所有已定义的请求 - 网站通常会检测到这种突出行为,即尝试使服务器超载(DoS攻击)。由于您自己的硬件/网络限制,这也不是一个好主意 - 如果您需要发出1000个请求并且每个响应都有1 MB,您突然需要下载1 GB的响应数据。更糟糕的是,您的网络可能会过载,以至于某些请求只会超时。
您需要添加某种限制以将在任何给定时间发出的请求数量限制为合理数量。我个人推荐async.js库,特别是它的eachLimit()实用程序。
答案 1 :(得分:1)
修改代码以执行此类操作;
var request = require('request');
var curlList = [{
id: 1,
href: '/name1'
}, {
id: 2,
href: '/name2'
}, {
id: 3,
href: '/name3'
}];
var curl = function(id, url, done) {
var payload = {
id: id
};
var options = {
method: 'post',
body: payload,
json: true,
url: ""
}
request(options, function(err, res, body) {
done(err);
if (err) {
console.log(err, 'error posting json')
return
}
//Calculate response data
//If match
if (match) {
console.log(url);
}
});
};
app.listen(3000, function() {
int current = 1;
int max = 5; // max 5 parallel
var scheduleJobs = function() {
current--;
while(current < max) {
current++;
var job = curList.shift();
curl(job.id, job.href, scheduleJobs);
}
}
scheduleJobs();
});
这允许最多5个并行请求。