Node.js sieht interessant aus, ABER ich muss etwas verpassen - ist Node.js nicht nur für die Ausführung auf einem einzelnen Prozess und Thread ausgelegt?
Wie skaliert es dann für Multi-Core-CPUs und Multi-CPU-Server? Immerhin ist es großartig, einen Single-Thread-Server so schnell wie möglich zu machen, aber für hohe Lasten würde ich mehrere CPUs verwenden wollen. Das Gleiche gilt für die Beschleunigung von Anwendungen - heute werden anscheinend mehrere CPUs verwendet und die Aufgaben parallelisiert.
Wie passt Node.js in dieses Bild? Ist es die Idee, mehrere Instanzen irgendwie zu verteilen, oder was?
javascript
node.js
node-cluster
zaharpopov
quelle
quelle
Antworten:
[ Dieser Beitrag ist ab dem 02.09.2012 auf dem neuesten Stand (neuer als oben). ]]
Node.js skaliert absolut auf Multi-Core-Maschinen.
Ja, Node.js ist ein Thread pro Prozess. Dies ist eine sehr bewusste Entwurfsentscheidung und macht die Sperrsemantik überflüssig. Wenn Sie damit nicht einverstanden sind, wissen Sie wahrscheinlich noch nicht, wie wahnsinnig schwierig es ist, Multithread-Code zu debuggen. Eine ausführlichere Erklärung des Node.js-Prozessmodells und warum es so funktioniert (und warum es NIEMALS mehrere Threads unterstützt), finden Sie in meinem anderen Beitrag .
Wie nutze ich meine 16-Core-Box?
Zwei Wege:
Skalieren des Durchsatzes auf einem Webservice
Seit v6.0.X hat Node.js das Cluster-Modul sofort integriert, wodurch es einfach ist, mehrere Node-Worker einzurichten, die einen einzelnen Port überwachen können. Beachten Sie, dass dies NICHT dasselbe ist wie das ältere Learnboost-Cluster-Modul, das über npm verfügbar ist .
Die Mitarbeiter konkurrieren um die Annahme neuer Verbindungen, und der am wenigsten belastete Prozess wird höchstwahrscheinlich gewinnen. Es funktioniert ziemlich gut und kann den Durchsatz auf einer Multi-Core-Box recht gut skalieren.
Wenn Sie genug Last haben, um sich um mehrere Kerne zu kümmern, sollten Sie noch ein paar Dinge tun:
Führen Sie Ihren Node.js-Dienst hinter einem Webproxy wie Nginx oder Apache aus - etwas, das die Verbindungsdrosselung durchführen kann (es sei denn, Sie möchten, dass die Überlastungsbedingungen die Box vollständig herunterfahren), URLs neu schreiben, statischen Inhalt bereitstellen und andere Unterdienste vertreten.
Recyceln Sie regelmäßig Ihre Arbeitsprozesse. Bei einem lang laufenden Prozess summiert sich möglicherweise sogar ein kleiner Speicherverlust.
Protokollsammlung / -überwachung einrichten
PS: Es gibt eine Diskussion zwischen Aaron und Christopher in den Kommentaren eines anderen Beitrags (zum Zeitpunkt dieses Schreibens ist es der oberste Beitrag). Ein paar Kommentare dazu:
Gemeinsame Ports:
nginx (port 80) --> Node_workers x N (sharing port 3000 w/ Cluster)
vs.
Einzelne Ports:
nginx (port 80) --> {Node_worker (port 3000), Node_worker (port 3001), Node_worker (port 3002), Node_worker (port 3003) ...}
Die Einrichtung der einzelnen Ports bietet möglicherweise einige Vorteile (möglicherweise weniger Kopplung zwischen Prozessen, differenziertere Entscheidungen zum Lastenausgleich usw.), aber die Einrichtung ist definitiv aufwändiger und das integrierte Cluster-Modul ist niedrig -Komplexitätsalternative, die für die meisten Menschen funktioniert.
quelle
Eine Methode wäre, mehrere Instanzen von node.js auf dem Server auszuführen und dann einen Load Balancer (vorzugsweise einen nicht blockierenden wie nginx) vor sich zu platzieren.
quelle
Ryan Dahl beantwortet diese Frage in dem Tech-Vortrag, den er letzten Sommer bei Google gehalten hat . Um es zu paraphrasieren: "Führen Sie einfach mehrere Knotenprozesse aus und verwenden Sie etwas Sinnvolles, damit sie kommunizieren können, z. B. IPC im Sendmsg () - Stil oder traditioneller RPC".
Wenn Sie sich sofort die Hände schmutzig machen möchten,schauenSie sich dasspark2Forever- Modul an. Es macht das Laichen mehrerer Knotenprozesse trivial einfach. Es übernimmt das Einrichten der Portfreigabe, sodass jeder Verbindungen zu demselben Port akzeptieren kann, und das automatische Respawning, wenn Sie sicherstellen möchten, dass ein Prozess neu gestartet wird, wenn er stirbt.UPDATE - 10/11/11 : In der Knotengemeinschaft scheint Konsens darüber zu bestehen, dass Cluster jetzt das bevorzugte Modul für die Verwaltung mehrerer Knoteninstanzen pro Computer ist. Für immer ist auch ein Blick wert.
quelle
Sie können das Cluster- Modul verwenden. Überprüfen Sie dies .
quelle
Multi-Node nutzt alle Kerne, die Sie möglicherweise haben.
Schauen Sie sich http://github.com/kriszyp/multi-node an .
Für einfachere Anforderungen können Sie mehrere Kopien des Knotens an verschiedenen Portnummern starten und einen Load Balancer vor sie stellen.
quelle
Node Js unterstützt Clustering, um die Vorteile Ihrer CPU voll auszuschöpfen. Wenn Sie es nicht mit Cluster ausführen, verschwenden Sie wahrscheinlich Ihre Hardwarefunktionen.
Durch Clustering in Node.js können Sie separate Prozesse erstellen, die denselben Serverport gemeinsam nutzen können. Wenn wir beispielsweise einen HTTP-Server auf Port 3000 ausführen, handelt es sich um einen Server, der auf einem einzelnen Thread auf einem einzelnen Prozessorkern ausgeführt wird.
Mit dem unten gezeigten Code können Sie Ihre Anwendung gruppieren. Dieser Code ist der offizielle Code von Node.js.
In diesem Artikel finden Sie das vollständige Tutorial
quelle
Wie oben erwähnt, skaliert Cluster Ihre App und verteilt sie auf alle Kerne.
etwas hinzufügen wie
Startet alle fehlerhaften Worker neu.
Heutzutage bevorzugen viele Leute auch PM2 , das das Clustering für Sie übernimmt und auch einige coole Überwachungsfunktionen bietet .
Fügen Sie dann Nginx oder HAProxy vor mehreren Computern hinzu, auf denen Clustering ausgeführt wird, und Sie haben mehrere Failover-Ebenen und eine viel höhere Ladekapazität.
quelle
Mit der zukünftigen Version des Knotens können Sie einen Prozess verzweigen und Nachrichten an ihn weiterleiten. Ryan hat erklärt, dass er einen Weg finden möchte, um auch Dateihandler gemeinsam zu nutzen, sodass dies keine einfache Implementierung von Web Worker ist.
Derzeit gibt es keine einfache Lösung dafür, aber es ist noch sehr früh und Node ist eines der am schnellsten laufenden Open Source-Projekte, die ich je gesehen habe. Erwarten Sie also in naher Zukunft etwas Großartiges.
quelle
Spark2 basiert auf Spark, das jetzt nicht mehr gepflegt wird. Cluster ist sein Nachfolger und verfügt über einige coole Funktionen, z. B. das Laichen eines Worker-Prozesses pro CPU-Kern und das Respawn toter Worker.
quelle
Ich verwende Node Worker , um Prozesse auf einfache Weise von meinem Hauptprozess aus auszuführen. Scheint großartig zu funktionieren, während wir auf den offiziellen Weg warten.
quelle
Das neue Kind auf dem Block hier ist LearnBoosts "Up" .
Es bietet "Zero-Downtime-Reloads" und erstellt zusätzlich mehrere Worker (standardmäßig die Anzahl der CPUs, aber konfigurierbar), um das Beste aus allen Welten zu bieten.
Es ist neu, scheint aber ziemlich stabil zu sein, und ich verwende es gerne in einem meiner aktuellen Projekte.
quelle
Mit dem Cluster- Modul können Sie alle Kerne Ihres Computers verwenden. Tatsächlich können Sie dies in nur 2 Befehlen und ohne Berühren Ihres Codes mit einem sehr beliebten Prozessmanager pm2 nutzen .
quelle
Sie können Ihre Anwendung node.js auf mehreren Kernen ausführen, indem Sie das Cluster- Modul in Kombination mit dem OS- Modul verwenden, mit dem ermittelt werden kann, wie viele CPUs Sie haben.
Stellen Sie sich zum Beispiel vor, Sie haben ein
server
Modul, auf dem ein einfacher http-Server im Backend ausgeführt wird, und Sie möchten es für mehrere CPUs ausführen:quelle
Es ist auch möglich, den Webdienst als mehrere eigenständige Server zu gestalten, die Unix-Sockets abhören, sodass Sie Funktionen wie die Datenverarbeitung in separate Prozesse übertragen können.
Dies ähnelt den meisten Scrpting- / Datenbank-Webserver-Architekturen, bei denen ein CGI-Prozess die Geschäftslogik verarbeitet und die Daten dann über einen Unix-Socket in eine Datenbank überträgt.
Der Unterschied besteht darin, dass die Datenverarbeitung als Knoten-Webserver geschrieben wird, der einen Port überwacht.
Es ist komplexer, aber letztendlich muss die Multi-Core-Entwicklung dahin gehen. Eine Multiprozessarchitektur mit mehreren Komponenten für jede Webanforderung.
quelle
Es ist möglich, NodeJS mit einem reinen TCP-Load-Balancer (HAProxy) vor mehreren Boxen, in denen jeweils ein NodeJS-Prozess ausgeführt wird, auf mehrere Boxen zu skalieren.
Wenn Sie dann allgemeines Wissen haben, das Sie zwischen allen Instanzen teilen können, können Sie einen zentralen Redis-Speicher oder ähnliches verwenden, auf den dann von allen Prozessinstanzen aus zugegriffen werden kann (z. B. von allen Feldern aus).
quelle