[英]Nodejs request loop limit
這是我的第一個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);
}
});
您的for
循環會在幾微秒內啟動所有定義的請求-網站通常會檢測到諸如試圖使服務器超載( DoS攻擊)之類的干擾性行為。 由於您自己的硬件/網絡限制,這樣做也不是一個好主意-如果您需要發出1000個請求,而每個響應將有1 MB,則突然需要下載1 GB的響應數據。 更糟糕的是,您的網絡可能會過載,以至於某些請求只會超時。
您需要添加某種限制,以將在任何給定時間進行的請求數量限制為合理的數量。 我個人推薦async.js庫,尤其是它的eachLimit()實用程序。
修改您的代碼以執行以下操作;
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個並行請求。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.