Ich versuche zu verstehen, die Grenzen von NodeJs beim Dishing viel Inhalt unter Last. Insbesondere möchte ich wissen, ob das Streaming einer längeren Antwort auf einen Client blockiert wird.Führt das Streamen eines HTTP-Antwortblocks nodejs?
Ich habe eine sehr einfache Test-Setup erstellt wo Node reagiert nur auf jede Anfrage mit einem Stream, der von einem 1 GB http Download zieht. Hier ist mein Code:
var http = require('http');
var fs = require('fs');
var iterator = 0;
http.createServer(function(req, res) {
console.log('req received ', iterator++);
var url = 'http://download.thinkbroadband.com/1GB.zip';
http.get(url, bigFile => {
res.writeHead(200, {
'content-type': 'application/zip',
'content-length': bigFile.headers['content-length'],
});
bigFile.pipe(res);
});
}).listen(8003);
So startete ich diesen Knoten Server und auf den Endpunkt mit mehreren Registerkarten in meinem Browser. Interessant war, dass nachfolgende Antworten nicht sofort mit dem Code console.log('request received ', iterator++);
protokolliert werden. Stattdessen gibt es eine Verzögerung von 5 bis 10 Sekunden, bevor das erste Ereignis protokolliert wird.
Das ist seltsam für mich, denn wenn das Streaming einer HTTP-Antwort blockiert, sollte es warten, bis die erste Anfrage abgeschlossen ist, bevor die zweite akzeptiert wird. Wenn das Streaming nicht blockiert wird, erwarte ich, dass alle Anfragen sofort protokolliert werden, nachdem sie angefordert wurden.
Kann jemand das erklären?
Ich würde auch gerne irgendwelche Gedanken über Leistung hier hören. Knoten ist wahrscheinlich nicht wirklich für diese Art von Dingen gebaut. Die Download-Geschwindigkeit leidet wirklich bei mehreren Anfragen.