Ich habe eine Frage, mit der niemand zu helfen scheint. Wie wird dies in einem Produktionsmodus mit Tausenden von Anfragen gleichzeitig gehandhabt?Port-Blockierung für mehrere Benutzeranfragen
habe ich einen einfachen Testfall:
module.exports = {
index: function (req, res){
if (req.param('foo') == 'bar'){
async.series([
function(callback){
for (k=0; k <= 50000; k++){
console.log('did something stupid a few times');
}
callback();
}
], function(){
return res.json(null);
});
}else{
return res.view('homepage', {
});
}
}
};
Nun, wenn ich zu http://localhost:1337/?foo=bar gehen wird es offensichtlich eine Weile warten, bevor er antwortet. Also, wenn ich jetzt eine andere Sitzung (andere Browser oder Inkognito, und gehen Sie zu http://localhost:1337/ Ich erwarte ein Ergebnis sofort. Stattdessen wartet es auf die andere Anfrage zu beenden und nur dann wird es diese Anfrage durchlaufen lassen.
Daher ist es nicht asynchron und es ist ein riesiges Problem, wenn ich so viel wie 2 Personen gleichzeitig die Bedienung dieser App. Ich meine, diese App wird Drop-Downs aus Datenbanken, HTML-Dateien usw. serviert
Meine Frage ist das: Wie geht man mit so einem Problem um? Ich höre das Wort "Versprechen vs Rückrufe" - ist das eine Art Lösung für dieses Problem?
Ich weiß über Clustering, aber das auf ly trennt die Anfragen über die Menge der CPUs, letztendlich werden Sie es beheben, indem Sie maximal 8 Personen gleichzeitig erlauben, ohne blockiert zu werden. Es hat gewonnen, t 100 Anfragen gleichzeitig zu behandeln ...
P.S. Dieser Test sollte das Beispiel vereinfachen, aber denke an jemanden, der eine Datei hochlädt, einen Webdienst, der zu einem anderen Server geht, ein Zahlungsterminal, das darauf wartet, dass ein Benutzer den Pin eingibt, jemanden, der eine Datei von der App herunterlädt usw ...
Hallo - Holen Sie, was Sie sagen, aber ich habe das gleiche Problem mit einer Anfrage zu viele Daten aus einer Datenbank zu ziehen: die im Grunde die For-Schleife ersetzt. Grundsätzlich müssen Sie darauf warten, dass die Liste der Datensätze aus der Datenbank abgerufen wird und während dieser Zeit die anderen Anforderungen blockiert werden. –
@MihaiPop - Das hängt vollständig von den Fähigkeiten Ihrer Datenbank und davon ab, wie viel Sie zurücksenden. Sicher, wenn Sie Ihre Datenbank laden, kann sie möglicherweise nicht mehrere gleichzeitige Anforderungen selbst behandeln. Dies ist ein Gesamtsystemproblem (nicht nur node.js) und der schwächste Link steuert den maximalen Durchsatz, den Sie haben können. Wenn alle node.js Daten aus einer Datenbank erfasst und über einen Socket sendet, bezweifle ich, dass node.js der Engpass ist. Sie müssen ein Profil erstellen, um zu verstehen, wo sich der Engpass befindet und was geändert werden muss, um mehr Durchsatz zu erzielen. – jfriend00
@MihaiPop - Ich weiß nicht, was Sie von mir hier wollen. Ich habe beschrieben, wie die Dinge funktionieren, und Sie scheinen nur mit mir streiten zu wollen. node.js ist extrem skalierbar, wenn es richtig verwendet wird, aber es muss richtig verwendet werden, um diese Vorteile zu erreichen. Und wenn es andere Komponenten im System gibt (wie Datenbanken, andere Server, etc ...), dann ist Systemskalierbarkeit ein Systemproblem, nicht nur ein Problem von node.js und erfordert sowohl sorgfältiges Design als auch Tests und möglicherweise Design-Modifikationen zur Maximierung der Skalierung. – jfriend00