Mein Programm kommuniziert mit einem Webdienst, der nur ~10 Anfragen pro Sekunde akzeptiert. Von Zeit zu Zeit sendet mein Programm über 100 gleichzeitige Anfragen an den Webdienst, was dazu führt, dass mein Programm abstürzt.
Wie kann ich gleichzeitige Anfragen in Node.js auf 5 pro Sekunde begrenzen? Ich verwende die Anfragembibliothek.
// IF EVENT AND SENDER
if(data.sender[0].events && data.sender[0].events.length > 0) {
// FIND ALL EVENTS
for(var i = 0; i < data.sender[0].events.length; i++) {
// IF TYPE IS "ADDED"
if(data.sender[0].events[i].type == "added") {
switch (data.sender[0].events[i].link.rel) {
case "contact" :
batch("added", data.sender[0].events[i].link.href);
//_initContacts(data.sender[0].events[i].link.href);
break;
}
// IF TYPE IS "UPDATED"
} else if(data.sender[0].events[i].type == "updated") {
switch (data.sender[0].events[i].link.rel){
case "contactPresence" :
batch("updated", data.sender[0].events[i].link.href);
//_getContactPresence(data.sender[0].events[i].link.href);
break;
case "contactNote" :
batch("updated", data.sender[0].events[i].link.href);
// _getContactNote(data.sender[0].events[i].link.href);
break;
case "contactLocation" :
batch("updated", data.sender[0].events[i].link.href);
// _getContactLocation(data.sender[0].events[i].link.href);
break;
case "presenceSubscription" :
batch("updated", data.sender[0].events[i].link.href);
// _extendPresenceSubscription(data.sender[0].events[i].link.href);
break;
}
}
};
Und dann die selbstgemachte Batch-Methode:
var updated = [];
var added = [];
var batch = function(type, url){
console.log("Batch aufgerufen");
if (type === "added"){
console.log("Hinzufügen ins Batch");
added.push(url);
if (added.length > 5) {
setTimeout(added.forEach(function(req){
_initContacts(req);
}), 2000);
added = [];
}
}
else if (type === "updated"){
console.log("Aktualisierung ins Batch");
updated.push(url);
console.log("Aktualisierungslänge ist : ", updated.length);
if (updated.length > 5){
console.log("Mehr als 5 aktualisierte Ereignisse");
updated.forEach(function(req){
setTimeout(_getContactLocation(req), 2000);
});
updated = [];
}
}
};
Und ein Beispiel für die tatsächliche Anfrage:
var _getContactLocation = function(url){
r.get(baseUrl + url,
{ "strictSSL" : false, "headers" : { "Authorization" : "Bearer " + accessToken }},
function(err, res, body){
if(err)
console.log(err);
else {
var data = JSON.parse(body);
self.emit("data.contact", data);
}
}
);
};