Die zunehmende Entwicklung von JavaScript hat viele Veränderungen mit sich gebracht und das Gesicht der Webentwicklung ist heute völlig anders geworden. Vor ein paar Jahren wäre es undenkbar gewesen, JavaScript auf einem Server auszuführen.
Bevor Sie sich mit Node.js befassen, möchten Sie vielleicht die Vorteile der Verwendung von Cross-Stack-JavaScript verstehen, das die Sprache und das Datenformat (JSON) vereinheitlicht und es Ihnen ermöglicht, Entwicklerressourcen optimal wiederzuverwenden. Die Einbindung von Node.js in den Technologie-Stack ist ein entscheidender Vorteil.
Node.js ist eine JavaScript-Laufzeitumgebung, die auf der JavaScript-Engine V8 von Chrome basiert. Es ist erwähnenswert, dass Ryan Dahl, der Schöpfer von Node.js, „von Anwendungen wie Gmail inspiriert“ wurde und sein Ziel darin bestand, eine Website mit „Echtzeit-Push-Funktionalität“ zu entwickeln. In Node.js bietet es eine Möglichkeit zur Verarbeitung nicht blockierender ereignisgesteuerter E/A. [Video-Tutorial-Empfehlung: nodejs-Tutorial ]Um es in einem Satz zusammenzufassen: Node.js glänzt in Echtzeit-Webanwendungen, die auf der Websockets-Push-Technologie basieren. Nachdem wir mehr als 20 Jahre lang zustandslose Webanwendungen verwendet haben, die auf dem zustandslosen Anforderungs-Antwort-Muster basieren, verfügen wir nun endlich über Webanwendungen, die bidirektionale Echtzeitverbindungen ermöglichen, bei denen sowohl der Client als auch der Server die Kommunikation initiieren und ihnen den freien Datenaustausch ermöglichen können .
Dies steht im krassen Gegensatz zum typischen Web-Response-Modell, bei dem die Kommunikation immer vom Kunden initiiert wird. Darüber hinaus basiert es auch auf dem offenen Web-Technologie-Stack (HTML, CSS und JS), der auf dem Standardport 80 läuft.
Man könnte argumentieren, dass wir dies schon seit Jahren in Form von Flash- und Java-Applets tun – aber in Wirklichkeit handelte es sich lediglich um Sandbox-Umgebungen, die das Web als Transportprotokoll nutzten, um Daten zum Client zu übertragen. Darüber hinaus laufen sie isoliert, oft auf nicht standardmäßigen Ports, was möglicherweise zusätzliche Berechtigungen erfordert.
Mit seinen Stärken spielt Node.js eine Schlüsselrolle im Technologie-Stack vieler namhafter Unternehmen, die auf seine einzigartigen Vorteile vertrauen. Die Node.js Foundation hat fast alle der besten Ideen zusammengestellt, und eine kurze PPT dazu, warum Unternehmen Node.js in Betracht ziehen sollten, finden Sie auf der Fallstudienseite der
Node.js Foundation. In diesem Artikel werde ich nicht nur besprechen, wie Sie diese Vorteile nutzen können, sondern auch,
warumSie Node.js verwenden möchten, und zwar anhand einiger klassischer Webanwendungsmodelle als Beispiele. Wie funktioniert es?
Das ist ein Bissen zum Lesen.
Das bedeutet, dass Node.js
keine neue, alles lösende Plattform ist, die im Begriff ist, die Welt der Webentwicklung zu dominieren.Stattdessen handelt es sich um eine Plattform, die ein bestimmtes Bedürfnis erfüllt. Es ist unbedingt notwendig, dies zu verstehen. Sie möchten Node.js niemals für CPU-intensive Vorgänge verwenden; wenn Sie es für viele anspruchsvolle Rechenaufgaben verwenden, werden fast alle seine Vorteile zunichte gemacht. Wo Node.js wirklich glänzt, ist die Erstellung schneller, skalierbarer Webanwendungen, da es in der Lage ist, eine große Anzahl gleichzeitiger Verbindungen mit hohem Durchsatz zu verarbeiten, was einer hohen Skalierbarkeit entspricht. Das zugrundeliegende Funktionsprinzip ist sehr interessant. Herkömmliche Webservice-Technologie erzeugt für jede Verbindung (Anfrage) einen neuen Thread, der Systemspeicher belegt und letztendlich durch den maximal verfügbaren Speicher begrenzt ist, während Node.js auf einem einzelnen Thread ausgeführt wird und nicht blockierende E/A-Aufrufe verwendet, was dies ermöglicht Unterstützt Zehntausende gleichzeitiger Verbindungen (in der Ereignisschleife
verwaltet).Schnelle Berechnung: Unter der Annahme, dass jeder Thread 2 MB Speicher benötigt, würde die Ausführung auf einem System mit 8 GB Speicher theoretisch bis zu 4000 gleichzeitige Verbindungen ermöglichen (Berechnung aus Michael Abernethys Artikel „Just what is Node.js?“, veröffentlicht bei IBM DeveloperWorks im Jahr 2011; leider ist der Link zu diesem Artikel jetzt tot) , und darin sind noch nicht einmal die Kosten für den Kontextwechsel zwischen Threads enthalten. Dies ist das Szenario, mit dem Sie normalerweise in der herkömmlichen Webserver-Technologie zu tun haben. Durch die Vermeidung all dieser Probleme erreicht Node.js Werte von über 1 Million gleichzeitigen Verbindungen und 600.000 gleichzeitigen WebSockets-Verbindungen. Natürlich besteht eine potenzielle Gefahr beim Schreiben von Node.js-Anwendungen darin, dass Clientanforderungen einen einzelnen Thread gemeinsam nutzen müssen. Erstens können umfangreiche Berechnungen den einzelnen Thread eines Knotens blockieren und Probleme für alle Clients verursachen (mehr dazu später), da eingehende Anforderungen blockiert werden, bis die Berechnung abgeschlossen ist. Zweitens müssen Entwickler sehr vorsichtig sein, dass keine Ausnahmen bis zur zentralen (obersten) Node.js-Ereignisschleife aufsteigen, was zum Beenden der Node.js-Instanz (Programmabsturz) führen würde. Um zu verhindern, dass Ausnahmen bis zur obersten Ebene aufsteigen, besteht eine gängige Technik darin, Fehler als Rückrufparameter an den Aufrufer zurückzugeben (anstatt sie wie in anderen Kontexten auszulösen). Auch wenn einige nicht behandelte Ausnahmen bis zur obersten Ebene sprudeln, gibt es Tools, um den Node.js-Prozess zu überwachen und die notwendige Wiederherstellung nach Abstürzen durchzuführen (obwohl eine Wiederherstellung auf den aktuellen Status der Benutzersitzung möglicherweise nicht möglich ist). Gemeinsam ist das Forever-Modul. Eine Sache, die bei der Diskussion von Node.js auf keinen Fall übersehen werden sollte, ist die Unterstützung der Paketverwaltung mithilfe des integrierten npm-Tools, das standardmäßig in jeder Node.js-Umgebung installiert ist. Das Konzept der npm-Module ist dem von Ruby Gems sehr ähnlich: ein Satz wiederverwendbarer Komponenten, die einfach über ein Online-Repository installiert werden können, mit Versions- und Abhängigkeitsverwaltung. Die vollständige Liste der gepackten Module finden Sie auf der npm-Website oder können mit dem npm-CLI-Tool aufgerufen werden, das automatisch mit Node.js installiert wird. Das Modul-Ökosystem steht jedem offen, jeder kann seine eigenen Module veröffentlichen und die veröffentlichten Module werden im npm-Repository angezeigt. Eine Einführung in npm finden Sie im Anfängerleitfaden und im Abschnitt über Veröffentlichungsmodule im npm-Publishing-Tutorial. Einige nützliche npm-Module sind: Die Liste wird immer länger. Es gibt viele nützliche Pakete, die jeder nutzen kann. Online-Chat ist die typischste Echtzeit-Mehrbenutzeranwendung und der beste Fall von Node.js: Es ist eine leichte, datenintensive (aber Anwendungen mit geringem Verarbeitungs- und Rechenaufwand, die auf mehrere Geräte verteilt werden können. Es ist auch ein großartiger Studienfall, weil er einfach ist, aber die meisten Paradigmen abdeckt, die Sie in einem typischen Node.js-Programm verwenden würden. Versuchen wir uns vorzustellen, wie es funktioniert. Angenommen, das einfachste Szenario wäre, dass es auf unserer Website einen Chatraum gibt, in dem Menschen Nachrichten im Eins-zu-Viele-Prinzip (eigentlich an alle) austauschen können. Auf der Serverseite haben wir ein einfaches Express.js-Programm, das zwei Dinge implementiert: 1) einen Handler für GET-Anfragen, der eine „Senden“-Schaltflächenfunktion mit dem Message Board und einer Eingabe zum Initialisieren neuer Nachrichten bereitstellt und 2) ein Websockets-Server, der auf neue Nachrichten von Websocket-Clients wartet. Auf der Clientseite haben wir eine HTML-Seite mit einigen Handlern eingerichtet, einen für das Klickereignis der Schaltfläche „Senden“, der die Eingabenachricht empfängt und an den Websocket sendet, und einen weiteren, der darauf wartet Neue Informationen zu eingehenden Nachrichten, die auf dem Websockets-Client angezeigt werden (d. h. von anderen Benutzern gesendete Nachrichten, die der Server vom Client anzeigen lassen möchte). Wenn einer der Clients eine Nachricht postet, passiert Folgendes:
Dies ist das einfachste Beispiel. Für eine robustere Lösung können Sie einen einfachen Redis-basierten Cache verwenden. Oder in einer fortgeschritteneren Lösung kann eine Nachrichtenwarteschlange als Nachrichtenroute verwendet und ein leistungsfähigerer Übermittlungsmechanismus implementiert werden, z. B. das Speichern von Nachrichten, wenn die Verbindung unterbrochen wird oder der Client offline ist. Aber egal welche Verbesserungen Sie vornehmen, Node.js läuft immer noch nach den gleichen Grundprinzipien: auf Ereignisse reagieren, viele gleichzeitige Verbindungen verarbeiten und für ein reibungsloses Benutzererlebnis sorgen. Node.js eignet sich zwar hervorragend für die Entwicklung von Echtzeitanwendungen, eignet sich aber auch hervorragend zum Offenlegen von Daten aus Objektdatenbanken wie MongoDB. Durch JSON-gespeicherte Daten kann Node.js gut mit Objekten arbeiten, die mit den gespeicherten Daten konsistent sind, und zwar ohne Datenkonvertierung. Wenn Sie beispielsweise Rails verwenden, müssen Sie von JSON in binäre Modelle konvertieren und diese dann über HTTP in JSON konvertieren, um sie in React.js oder Angular.js zu verwenden, oder sogar einfache jQuery-AJAX-Aufrufe durchführen. Mit Node.js können Sie Ihre JSON-Objekte über eine REST-API direkt für den Client-Verbrauch verfügbar machen. Darüber hinaus müssen Sie sich beim Lesen aus oder Schreiben in die Datenbank (wenn Sie MongoDB verwenden) keine Gedanken über die Konvertierung zwischen JSON und irgendetwas anderem machen. Kurz gesagt: Durch die Verwendung eines einheitlichen Datenserialisierungsformats im Client, Server und in der Datenbank können die Probleme mehrerer Konvertierungen vermieden werden. Wenn Sie viele gleichzeitige Daten erhalten, kann Ihre Datenbank zu einem Engpass werden. Wie oben erwähnt, kann Node.js gleichzeitige Verbindungen problemlos selbstständig verarbeiten. Da der Datenbankzugriff jedoch (in diesem Fall) ein blockierender Vorgang ist, geraten wir in Schwierigkeiten. Die Lösung besteht darin, das Verhalten des Clients zu bestätigen, bevor die Daten tatsächlich in die Datenbank geschrieben werden. Mit diesem Ansatz kann das System seine Reaktionsfähigkeit unter hoher Last beibehalten, was besonders nützlich ist, wenn der Client nicht bestätigen muss, dass die Daten erfolgreich geschrieben wurden. Typische Beispiele sind: Stapelverarbeitung beim Protokollieren oder Schreiben von Benutzerverfolgungsdaten; und „eventuelle Konsistenz“ (oft in der NoSQL-Welt verwendet), die für Vorgänge akzeptabel ist, die keine sofortige Reaktion erfordern (z. B. das Aktualisieren der „Gefällt mir“-Anzahl auf Facebook). . Daten werden in einer Art Cache oder Nachrichtenwarteschlange (z. B. RabbitMQ, ZeroMQ) in die Warteschlange gestellt und von einem separaten Datenbank-Batch-Schreibprozess oder von einem rechenintensiven Backend-Dienst verarbeitet, der eine solche Aufgabenplattform besser ausführen kann. Ein ähnliches Verhalten kann in anderen Sprachen oder Frameworks implementiert werden, jedoch nicht auf derselben Hardware, um den gleichen hohen Durchsatz aufrechtzuerhalten. Kurz gesagt: Mit Node können Sie Datenbankschreibvorgänge an einer Stelle schreiben und sie später so verarbeiten, als ob sie erfolgreich verarbeitet worden wären. Auf traditionelleren Webplattformen werden HTTP-Anfragen und -Antworten als isolierte Ereignisse betrachtet, obwohl es sich in Wirklichkeit um Streams handelt. Sie können diese Eigenschaft in Node.js verwenden, um einige coole Funktionen zu erstellen. Beispielsweise können Dateien gleichzeitig hochgeladen und verarbeitet werden. Da die Daten über den Stream eingehen, können wir sie in Echtzeit verarbeiten. Dies kann für die Echtzeit-Audio- und Videokodierung sowie für das Proxying zwischen verschiedenen Datenquellen verwendet werden (siehe nächster Abschnitt). Es ist einfach, Node.js als serverseitigen Proxy zu verwenden, der eine große Anzahl gleichzeitiger Verbindungen auf nicht blockierende Weise verarbeiten kann. Dies ist besonders nützlich für Proxys für mehrere Dienste mit unterschiedlichen Antwortzeiten oder für Szenarien, in denen Daten aus mehreren Quellen gesammelt werden. Zum Beispiel das folgende Szenario: Wenn das serverseitige Programm mit Ressourcen von Drittanbietern kommuniziert, extrahiert es Daten aus verschiedenen Quellen oder speichert Ressourcen wie Bilder und Videos in Cloud-Diensten von Drittanbietern. Wenn Sie trotz dedizierter Proxy-Server nicht über eine grundlegende Proxy-Infrastruktur verfügen oder eine lokale Entwicklungsumgebung benötigen, kann Node Ihnen helfen. Kehren wir zur Anwendung zurück. Ein weiteres Beispiel, das leicht durch eine Echtzeit-Weblösung ersetzt werden kann, ist die Handelssoftware eines Börsenmaklers, mit der Aktienkurse verfolgt, Berechnungen durchgeführt, technische Analysen durchgeführt und Diagramme erstellt werden. Makler können den Arbeitsplatz bzw. Arbeitsplatz problemlos wechseln, wenn sie auf eine webbasierte Live-Lösung umsteigen. Bald könnten wir sie vielleicht an den Stränden Floridas sehen ... Ein weiterer häufiger Anwendungsfall, für den Node-with-Web-Socket perfekt geeignet ist: Website-Besucher verfolgen und ihre Interaktionen in Echtzeit visualisieren . Sie können in Echtzeit Statistiken von Ihren Nutzern sammeln und sogar Kommunikationskanäle öffnen und gezielt an bestimmten Stellen im Funnel mit Ihren Besuchern interagieren, ein Szenario wie dieses finden Sie hier: CANDDi. Stellen Sie sich vor, Sie könnten Ihr Geschäft verbessern, wenn Sie in Echtzeit verstehen könnten, was Ihre Besucher tun. Sie können dies jetzt tun, indem Sie die bidirektionalen Echtzeit-Sockets von Node.js verwenden. In Bezug auf die Infrastruktur. Zum Beispiel ein SaaS-Anbieter, der seinen Benutzern eine Service-Überwachungsseite bereitstellen möchte (z. B. GitHub-Statusseite). Mit der Node.js-Ereignisschleife können wir ein leistungsstarkes webbasiertes Dashboard erstellen, das asynchron den Status des Dienstes überprüft und Websockets verwendet, um Daten an den Client zu übertragen. Mithilfe dieser Technologie kann der Status sowohl interner Unternehmen als auch öffentlicher Dienste in Echtzeit gemeldet werden. Hinweis: Versuchen Sie nicht, harte Echtzeitsysteme (d. h. Systeme, die konsistente Antwortzeiten erfordern) in Node.js zu erstellen. Für diese Art von Anwendung ist Erlang möglicherweise die bessere Wahl . Node.js mit Express.js kann auch klassische Webanwendungen auf der Serverseite erstellen. Es gibt Befürworter und Gegner dieses Ansatzes. Hier sind einige Dinge zu beachten: Vorteile: Nachteile: Eine Alternative zu CPU-intensivem Computing besteht darin, eine hoch skalierbare MQ-fähige Umgebung mit Back-End-Verarbeitung zu erstellen, damit Node zum Front-End-„Staffer“ werden und Client-Anfragen asynchron bearbeiten kann. Vergleichen Sie beispielsweise Node.js + Express.js mit Ruby on Rails, wenn es um den relationalen Datenzugriff geht. Letzteres ist offensichtlich mehr geeignet. Node.js‘ relationale Datenbank-Tools sind im Vergleich zu seinen Konkurrenten immer noch recht primitiv. Rails hingegen bietet zusätzlich zu anderen Gems sofort einsatzbereite Tools zur Einrichtung des Datenzugriffs und zur Unterstützung der Migration von Datenbankschemata. Rails und ähnliche Frameworks verfügen über ausgereifte und bewährte Active Record- oder Data Mapper-Datenzugriffsschichtimplementierungen, also viel Glück beim Versuch, diese Funktionen in reinem JavaScript zu replizieren. Wenn Sie es jedoch wirklich vorziehen, alles in JS zu implementieren, schauen Sie sich Sequelize und Node ORM2 an. Wenn Sie Node.js nur als öffentlich zugängliche Schnittstelle verwenden und gleichzeitig ein Rails-Backend für den Zugriff auf eine relationale Datenbank verwenden, ist dies in Ordnung und nicht ungewöhnlich. Node.js ist nicht die beste Plattform, wenn es um umfangreiche Berechnungen geht. Sie möchten auf keinen Fall einen Fibonacci Compute Server mit Node.js erstellen. Typischerweise macht jeder CPU-intensive Vorgang alle Durchsatzvorteile zunichte, die Node durch das ereignisgesteuerte, nicht blockierende E/A-Modell bietet, da alle eingehenden Anforderungen blockiert werden, während der Thread mit der Zahlenverarbeitung beschäftigt ist. Wie bereits erwähnt, ist Node.js Single-Threaded und verwendet nur einen CPU-Kern. Wenn es darum geht, Parallelität auf Multi-Core-Servern hinzuzufügen, hat das Node-Kernteam einige Arbeit in Form des Cluster-Moduls geleistet. Sie können auch problemlos mehrere Node.js-Serverinstanzen hinter dem Reverse Proxy Nginx ausführen. Wenn Sie einen Cluster verwenden, sollten Sie dennoch alle umfangreichen Berechnungen in Hintergrundprozesse verlagern, die in einer geeigneteren Umgebung geschrieben sind, und sie über einen Nachrichtenwarteschlangenserver wie RabbitMQ kommunizieren lassen. Auch wenn Ihre gesamte Hintergrundverarbeitung zunächst möglicherweise auf demselben Server läuft, bietet dieser Ansatz das Potenzial, eine sehr hohe Skalierbarkeit zu erreichen. Diese Hintergrundverarbeitungsdienste können problemlos auf separate Arbeitsserver verteilt werden, ohne dass die Last des Front-End-Webservers konfiguriert werden muss. Natürlich können Sie den gleichen Ansatz auch auf anderen Plattformen verwenden, aber mit Node.js erhalten Sie den hohen Anforderungs-/Sekunden-Durchsatz, über den wir gesprochen haben, da jede Anfrage eine sehr schnelle und effiziente kleine Aufgabe ist. Wir haben Node.js von der Theorie bis zur Praxis besprochen, angefangen bei seinen Zielen und Ambitionen bis hin zu seinen besten Punkten und Fallstricken. Wenn Menschen auf Probleme mit Node stoßen, läuft es fast immer darauf hinaus, dass Blockierungsvorgänge die Wurzel allen Übels sind – 99 % davon werden direkt durch den Missbrauch von Node verursacht. Denken Sie daran: Verwenden Sie Node.js nicht, um Computerskalierungsprobleme zu lösen. Es wurde entwickelt, um I/O-Skalierungsprobleme zu lösen, und es macht es wirklich gut . Wenn Ihre Anwendung also keine CPU-intensiven Vorgänge enthält und nicht auf blockierende Ressourcen zugreift, können Sie Node.js nutzen und schnelle und skalierbare Webanwendungen genießen. Originaladresse in Englisch: https://medium.com/the-node-js-collection/why-the-hell-would-you-use-node-js-4b053b94ab8e [Empfehlung für ein Video-Tutorial: nodejs Video-Tutorial】npm: Der Node-Paketmanager
Welche Gelegenheiten sollten Node.js verwenden?
Online-Chat
APIs zusätzlich zu Objektdatenbanken
Warteschlangeneingabe
Datenfluss
Proxy
Datenschnittstelle für Aktienhändler
Application Monitoring Dashboard
Systemüberwachungs-Dashboard
Wann kann ich Node.js verwenden?
Serverseitige Webanwendungen
Wann Node.js nicht verwendet werden sollte
Serverseitige Webanwendungen mit relationalen Datenbanken
Schwere serverseitige Berechnungen und Verarbeitung
Fazit
Das obige ist der detaillierte Inhalt vonWarum Node.js verwenden? Wann kann ich Node.js verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!