Hier sind 10 Leistungsregeln, die wir bei der Verwendung von node.js befolgen:
1. Vermeiden Sie die Verwendung von Synchroncode
In Bezug auf das Design ist Node.js Single-Threaded. Damit ein einzelner Thread viele gleichzeitige Anfragen verarbeiten kann, können Sie den Thread niemals auf Blockierung, Synchron oder langlebige Vorgänge warten lassen. Ein charakteristisches Merkmal von node.js ist, dass es von oben nach unten entworfen und implementiert ist, um asynchron zu erreichen. Dies macht es sehr geeignet für Veranstaltungsprogramme.
Leider besteht immer noch die Möglichkeit, dass Synchron-/Blockierungsanrufe auftreten. Beispielsweise haben viele Dateisystemoperationen sowohl synchrone als auch asynchrone Versionen wie WriteFile und WriteFilesync. Auch wenn Sie Code verwenden, um die Synchronisationsmethode zu steuern, ist es dennoch möglich, die externe Funktionsbibliothek zu verwenden, die Aufrufe versehentlich blockiert. Wenn Sie dies tun, ist die Auswirkungen auf die Leistung enorm.
// Gut: Dateien asynchronousfs.writeFile schreiben ('message.txt', 'Hallo Node', Funktion (err) {console.log ("Es wird gespeichert und der Server bleibt reaktionsschnell!");}); // schlecht: Dateien synchronfs.writFilesync ('message.txt', 'Hallo Node'); console.log ("Es wird gespeichert, aber Sie haben nur alle Anfragen blockiert!");Unser Initialisierungsprotokoll enthält ungewollt einen synchronen Aufruf, in der Implementierung Inhalte auf die Festplatte zu schreiben. Wenn wir keine Leistungstests durchführen, ist es einfach, dieses Problem zu ignorieren. Bei Verwendung einer Node.js -Instanz im Entwicklerfeld als Standardtest führt dieser synchrone Aufruf dazu, dass die Leistung von Tausenden von Anfragen pro Sekunde auf nur wenige Dutzend sinkt.
2. Schließen Sie den Socket -Pool
Der HTTP -Client von Node.js verwendet automatisch Socket -Pools: Standardmäßig begrenzt er nur 5 Sockets pro Host. Obwohl die Wiederverwendung von Steckdosen zu einem Anstieg der unter Kontrolle stehenden Ressourcen führen kann, wird dies zu einer Reihe von Engpässen führen, wenn Sie sich mit gleichzeitigen Anfragen desselben Hosts befassen. In diesem Fall ist es eine gute Idee, den Wert von Maxsockets zu erhöhen oder den Socket -Pool zu schließen:
// Socket Pooling var http = required ('http'); var options = {.....}; options.agent = false; var req = http.request (Optionen)3.. Lassen Sie statische Ressourcen nicht node.js verwenden
Verwenden Sie für statische Ressourcen wie CSS und Bilder Standard -Webserver anstelle von node.js. Zum Beispiel verwendet LinkedIn Mobile nginx. Wir verwenden auch Content Delivery Networks (CDNs), mit denen statische Ressourcen weltweit auf Server kopiert werden können. Dies hat zwei Vorteile: (1) Es kann die Last auf unserem Knoten reduzieren.
4. Rendern Sie den Kunden
Vergleichen wir schnell den Unterschied zwischen Serverwiedergabe und Client -Rendering. Wenn wir node.js verwenden, um auf der Serverseite zu rendern, senden wir für jede Anfrage eine HTML -Seite wie folgt zurück:
<!-Ein Beispiel für eine einfache Webseite, die vollständig servers Seite gerendert wurde-> <! DocType html> <html> <kopf> <titels> LinkedIn Mobile </title> </head> <body> <div> <img Src = "http://mobile-cdn.linkedin.com/images/lincedin.png! </div> </body> </html>
Bitte beachten Sie darauf, alle Inhalte dieser Seite zu beobachten, mit Ausnahme des Namens des Benutzers ist der Rest statisch: Die von jedem Benutzer und der Seite überlasteten Inhalt sind gleich. Ein effektiverer Ansatz besteht darin, Node.js nur den dynamischen Inhalt der Seite in JSON -Formular zurückzugeben.
{"Name": "John"}
Der Rest der Seite - alle statischen HTML -Tags - können in JavaScript -Vorlagen (wie z.
<!-Ein Beispiel für eine JavaScript-Vorlage, die Client-Seite gerendert werden kann-> <! DocType html> <html> <Head> <titels> LinkedIn Mobile </title> </head> <body> <div> <div> <img Src = "http:/.mobile-cdn.linkedin.com/image %>! </div> </body> </html>
Die Leistungsverbesserung stammt aus diesen Orten: Wie der dritte Punkt sagt, können statische JavaScript -Vorlagen auf der Serverseite über Webserver (wie NGINX) oder mit besseren CDNs implementiert werden. Darüber hinaus können JavaScript -Vorlagen im Browser zwischengespeichert oder lokal gespeichert werden. Nachdem alle ersten Seiten geladen wurden, sind die einzigen Daten, die an den Client gesendet werden müssen, JSON, was am effektivsten ist. Diese Methode kann die Ladung von CPU, IO und Node.js.
5. Verwenden Sie GZIP
Viele Server und Clients unterstützen GZIP, um Anfragen und Antworten zu komprimieren. Unabhängig davon, ob Sie einen Client beantworten oder eine Anfrage an einen Remote -Server senden, stellen Sie sicher, dass Sie die volle Nutzung nutzen.
6. Parallelisierung
Versuchen Sie, alle Ihre Blockiervorgänge zu lassen - senden Sie Anfragen, DB -Anrufe und Datei -Systemzugriffs -Parallelisierung zu Remotediensten. Dies verkürzt die Wartezeit für den langsamsten Blockiervorgang und nicht die Wartezeit für alle Blockiervorgänge. Um Rückrufe und Fehlerbehandlungen sauber zu halten, verwenden wir Schritt, um den Verkehr zu steuern.
7. Liberalisierung der Besessenheit
LinkedIn Mobile verwendet das Express -Framework, um Anforderungs-/Antwortzyklen zu verwalten. Viele Express -Beispiele enthalten die folgende Konfiguration:
app.use (Express.Session ({Secret: "Keyboard Cat"}));
Standardmäßig werden Sitzungsdaten im Speicher gespeichert, was dem Server einen enormen Overhead verleiht, insbesondere wenn die Anzahl der Benutzer zunimmt. Sie können einen externen Sitzungsspeicher wie MongoDB oder Redis verwenden. Jede Anfrage führt jedoch zum Overhead von Remote -Anrufen, um Sitzungsdaten zu erhalten. Wenn möglich, besteht die beste Option darin, alle staatenlosen Daten auf der Serverseite zu speichern. Durch die Liberalisierung der Sitzung, indem Sie nicht die obige Express -Konfiguration einbeziehen, werden Sie eine bessere Leistung sehen.
8. Verwenden Sie Binärmodule
Ersetzen Sie nach Möglichkeit JavaScript -Module durch Binärmodule. Wenn wir beispielsweise von einem in JavaScript geschriebenen SHA -Modul in eine kompilierte Version von Node.js konvertiert werden, sehen wir einen großen Leistungssprung in der Leistung:
// integrierte oder binäre modulesvar crypto = require ('crypto'); var hash = crypto.createhmac ("sha1", key) .update (SignatureBase) .digest ("Base64");9. Die Client -Bibliothek durch Standard -V8 JavaScript ersetzen
Viele JavaScript -Bibliotheken werden für die Verwendung in Webbrowsern erstellt, da in JavaScript -Umgebungen beispielsweise einige Browser Funktionen wie Foreach, Map und Reduzierung unterstützen, einige Browser jedoch nicht. Daher verwenden Clientbibliotheken normalerweise eine Menge ineffizienter Code, um Browserunterschiede zu überwinden. Andererseits können Sie in Node.js genau wissen, welche JavaScript-Methoden effektiv sind: V8 JavaScript Engine unterstützt Node.js, um das in der fünfte Ausgabe von ECMA-262 angegebene ECMASScript zu implementieren. Ersetzen Sie die Clientbibliothek direkt durch Standard -V8 -JavaScript -Funktionen. Sie finden erhebliche Leistungsverbesserungen.
10. Halten Sie Ihren Code klein und leicht
Die Verwendung eines mobilen Geräts macht den Zugriff langsam und die Latenz hoch, wodurch wir unseren Code klein und leicht halten. Die gleiche Philosophie wird für Servercode gepflegt. Schauen Sie gelegentlich auf Ihre Entscheidung zurück und stellen Sie sich Fragen wie: "Benötigen wir dieses Modul wirklich?", "Warum verwenden wir dieses Framework? Lohnt sich das Overhead unsere Verwendung?", "Können wir sie auf einfache Weise implementieren?". Der kleine und leichte Code ist normalerweise effizienter und schneller.
Versuchen Sie es
Wir arbeiten hart daran, unsere mobilen Apps schnell zu machen. Probieren Sie es auf Plattformen wie iPhone -Apps, Android -Apps und HTML5 -Versionen aus, um uns mitzuteilen, wie es uns geht.