Ich bin eine Node.js App mit Express ausgeführt und möchte beginnen, die Leistung zu erhöhen. Mehrere Routen sind definiert. Nehmen wir ein einfaches Beispiel haben:node.js Leistungsoptimierung und Single-Threaded-Architektur
app.get('/users', function (req, res) {
User.find({}).exec(function(err, users) {
res.json(users);
}
});
Nehmen wir an, wir haben 3 Kunden A, B und C, die versuchen, diesen Weg zu benutzen. Ihre Anfragen kommen auf dem Server in der Reihenfolge A, B, C mit einer Differenz von 1 Millisekunde dazwischen.
1. Wenn ich die Architektur von node.js richtig verstehe, wird jede Anfrage sofort bearbeitet, weil Users.find()
asynchron ist und es nicht blockierenden Code gibt?
Lassen Sie sich dieses Beispiel mit einem synchronen Aufruf erweitern:
app.get('/users', function (req, res) {
var parameters = getUserParameters();
User.find({parameters}).exec(function(err, users) {
res.json(users);
}
});
Gleiche Anfragen gleiche Reihenfolge. getUserParameters()
dauert 50 Millisekunden.
2. A gibt die Route Callback-Funktion ein und blockiert den Thread node.js für 50 Millisekunden. B und C können die Funktion nicht eingeben und müssen warten. Wenn A getUsersParameters()
beendet, wird es mit der asynchronen User.find()
Funktion fortfahren und B wird nun die Route Callback-Funktion eingeben. C muss noch 50 Millisekunden warten. Wenn B die asynchrone Funktion eingibt, können die Anforderungen von C abschließend behandelt werden. Zusammengenommen: C muss 50 Millisekunden warten, bis A beendet ist, 50 Millisekunden, bis B beendet ist, und 50 Millisekunden, bis es beendet ist (der Einfachheit halber ignorieren wir die Wartezeit für die asynchrone Funktion).
Angenommen, wir haben eine weitere Route, die nur von einem Admin erreichbar ist und jede Minute über crontab aufgerufen wird.
app.get('/users', function (req, res) {
User.find({}).exec(function(err, users) {
res.json(users);
}
});
app.get('/admin-route', function (req, res) {
blockingFunction(); // this function takes 2 seconds to complete
});
3. Wenn eine Anfrage X trifft admin-route
und blockingFunction()
genannt wird, wird A, B und C, die /users
direkt nach X Anfrage 2 Sekunden warten, haben rufen, bis sie auch die Rückruf-Funktion Route eingeben ?
4. Sollten wir jede selbstdefinierte Funktion, auch wenn sie nur 4 Millisekunden dauert, als asynchrone Funktion mit einem Callback ausführen?
auf diese Frage Irrelevant, aber ich habe gehört, ist ausdrücklich tot. – WitVault
Was wäre eine 'blockingFunction' in Node/JS? Afaik, alles ist um die Ereignisschleife herum modelliert. – Tobias