Frage

Ich verstehe nicht ganz, was Node.js dreht sich alles um.Vielleicht liegt es daran, dass ich hauptsächlich webbasierte Geschäftsanwendungen entwickle.Was ist das und welchen Nutzen hat es?

Mein bisheriges Verständnis ist Folgendes:

  1. Das Programmiermodell ist ereignisgesteuert, insbesondere die Art und Weise, wie es funktioniert E/A.
  2. Es benutzt JavaScript und der Parser ist V8.
  3. Es kann problemlos zum Erstellen gleichzeitiger Serveranwendungen verwendet werden.

Sind meine Auffassungen richtig?Wenn ja, was sind dann die Vorteile von ereignisgesteuerter E/A? Geht es nur um die Parallelität?Ist die Richtung von Node.js außerdem dahingehend, ein Framework-ähnliches, JavaScript-basiertes (V8-basiertes) Programmiermodell zu werden?

War es hilfreich?

Lösung

Ich denke, die Vorteile sind:

  1. Web-Entwicklung in einer dynamischen Sprache (JavaScript) auf einer VM, die unglaublich schnell (V8). Es ist viel schneller als Ruby, Python oder Perl.

  2. Die Fähigkeit, Tausende von gleichzeitigen Verbindungen mit minimalem Overhead auf einem einzigen Prozess zu behandeln.

  3. JavaScript ist perfekt für die Veranstaltung mit erstklassigen Funktionsobjekten und Verschlüssen Schleifen. Menschen, die bereits wissen, wie es auf diese Weise es im Browser Benutzer initiierten Ereignisse zu reagieren, verwendet zu verwenden.

  4. Eine Menge Leute schon JavaScript wissen, auch Menschen, die behaupten, nicht Programmierer zu sein. Es ist wohl die beliebteste Programmiersprache.

  5. Verwendung von JavaScript auf einem Web-Server als auch der Browser die Impedanzfehlanpassung zwischen den beiden Programmierumgebungen reduziert die Datenstrukturen über JSON kommunizieren kann, die auf beiden Seiten der Gleichung arbeiten. Duplizieren Validierungscode Form kann zwischen Server und Client, etc. geteilt werden.

Andere Tipps

Ich verwende Node.js bei der Arbeit und finde es sehr leistungsstark.Wenn ich gezwungen bin, ein Wort zur Beschreibung von Node.js zu wählen, würde ich „interessant“ sagen (was kein rein positives Adjektiv ist).Die Gemeinschaft ist lebendig und wächst.JavaScript kann trotz seiner Kuriositäten eine großartige Programmiersprache sein.Und Sie werden täglich Ihr eigenes Verständnis von „Best Practice“ und den Mustern von gut strukturiertem Code überdenken.In Node.js fließt derzeit eine enorme Energie an Ideen ein, und die Arbeit darin setzt Sie all diesen Denkweisen aus – großartiges mentales Gewichtheben.

Node.js in der Produktion ist durchaus möglich, aber weit entfernt von der „schlüsselfertigen“ Bereitstellung, die in der Dokumentation scheinbar versprochen wird.Mit Node.js v0.6.x wurde „Cluster“ in die Plattform integriert und stellt einen der wesentlichen Bausteine ​​bereit, aber mein „Production.js“-Skript umfasst immer noch etwa 150 Logikzeilen, um Dinge wie das Erstellen des Protokolls zu erledigen Verzeichnis, Recycling toter Arbeiter usw.Für einen „ernsthaften“ Produktionsdienst müssen Sie auch darauf vorbereitet sein, eingehende Verbindungen zu drosseln und alle Aufgaben zu erledigen, die Apache erledigt PHP.Um fair zu sein, Ruby auf Schienen hat das genau Problem.Es wird über zwei komplementäre Mechanismen gelöst:1) Ruby auf Rails/Node.js hinter einen dedizierten Webserver stellen (in C geschrieben und gründlich getestet) wie Nginx (oder Apache / Lighttd).Der Webserver kann statische Inhalte effizient bereitstellen, auf die Protokollierung zugreifen, URLs umschreiben und beenden SSL, Durchsetzung von Zugriffsregeln und Verwaltung mehrerer Unterdienste.Bei Anfragen, die den eigentlichen Knotendienst erreichen, leitet der Webserver die Anfrage weiter.2) Verwenden eines Frameworks wie Einhorn das die Arbeitsprozesse verwaltet, sie regelmäßig recycelt usw.Ich habe noch kein Node.js-Serving-Framework gefunden, das vollständig ausgereift zu sein scheint.Es mag existieren, aber ich habe es noch nicht gefunden und verwende immer noch etwa 150 Zeilen in meiner handgerollten „produktion.js“.

Leserahmen wie Äußern lässt den Eindruck entstehen, dass es gängige Praxis ist, einfach alles über einen Alleskönner-Node.js-Dienst bereitzustellen ...„app.use(express.static(__dirname + ‚/public‘))“.Für Dienste und Entwicklungen mit geringerer Auslastung ist das wahrscheinlich in Ordnung.Aber sobald Sie versuchen, Ihren Dienst stark zu belasten und ihn rund um die Uhr laufen zu lassen, werden Sie schnell die Beweggründe entdecken, die große Websites dazu drängen, gut gebackenen, gehärteten C-Code zu verwenden Nginx Sie leiten ihre Website und bearbeiten alle statischen Inhaltsanfragen (... bis Sie eine einrichten CDN, wie Amazon CloudFront)).Eine etwas humorvolle und unverhohlen negative Sichtweise dazu finden Sie unter dieser Typ.

Node.js findet auch immer mehr Anwendungen außerhalb von Diensten.Selbst wenn Sie etwas anderes zum Bereitstellen von Webinhalten verwenden, können Sie Node.js dennoch als Build-Tool verwenden npm Module zum Organisieren Ihres Codes, Browserify es zu einem einzigen Asset zusammenzufügen und uglify-js um es für die Bereitstellung zu minimieren.Für den Umgang mit dem Web ist JavaScript perfekt Impedanzanpassung Und das macht es häufig zum einfachsten Angriffsweg.Zum Beispiel, wenn Sie durch eine Menge schlendern möchten JSON Antwortnutzlasten sollten Sie my verwenden Unterstrich-CLI Modul, der Utility-Gürtel strukturierter Daten.

Für und Wider:

  • Profi:Für einen Server-Mitarbeiter war das Schreiben von JavaScript im Backend eine „Einstiegsdroge“ zum Erlernen moderner UI-Muster.Ich habe keine Angst mehr vor dem Schreiben von Client-Code.
  • Profi:Fördert tendenziell eine ordnungsgemäße Fehlerprüfung (err wird von praktisch allen Rückrufen zurückgegeben, was den Programmierer dazu zwingt, damit umzugehen;Außerdem handhaben async.js und andere Bibliotheken das Paradigma „Fehler, wenn eine dieser Unteraufgaben fehlschlägt“ viel besser als typischer synchroner Code.
  • Profi:Einige interessante und normalerweise schwierige Aufgaben werden trivial – etwa das Abrufen des Status von Aufgaben im laufenden Betrieb, die Kommunikation zwischen Mitarbeitern oder das Teilen des Cache-Status
  • Profi:Riesige Community und jede Menge tolle Bibliotheken basierend auf einem soliden Paketmanager (npm)
  • Nachteil:JavaScript hat keine Standardbibliothek.Man gewöhnt sich so sehr an das Importieren von Funktionen, dass es sich komisch anfühlt, wenn man JSON.parse oder eine andere eingebaute Methode verwendet, die kein Hinzufügen eines npm-Moduls erfordert.Das bedeutet, dass es von allem fünf Versionen gibt.Sogar die im Node.js-„Kern“ enthaltenen Module verfügen über fünf weitere Varianten, falls Sie mit der Standardimplementierung unzufrieden sein sollten.Dies führt zu einer schnellen Entwicklung, aber auch zu einem gewissen Maß an Verwirrung.

Im Vergleich zu einem einfachen Ein-Prozess-pro-Anfrage-Modell (LAMPE):

  • Profi:Skalierbar auf Tausende von aktiven Verbindungen.Sehr schnell und sehr effizient.Für eine Webflotte könnte dies im Vergleich zu PHP oder Ruby eine 10-fache Reduzierung der Anzahl der erforderlichen Boxen bedeuten
  • Profi:Das Schreiben paralleler Muster ist einfach.Stellen Sie sich vor, Sie müssen drei (oder N) Blobs von abrufen Im Speicher gespeichert.Tun Sie dies in PHP ...Haben Sie gerade Code geschrieben, der den ersten Blob, dann den zweiten und dann den dritten abruft?Wow, das ist langsam.Es gibt etwas Besonderes PECL Modul, um dieses spezielle Problem für Memcached zu beheben, aber was ist, wenn Sie einige Memcached-Daten parallel zu Ihrer Datenbankabfrage abrufen möchten?Da das Paradigma in Node.js asynchron ist, ist es ganz natürlich, dass eine Webanforderung mehrere Dinge parallel ausführt.
  • Nachteil:Asynchroner Code ist grundsätzlich komplexer als synchroner Code, und die anfängliche Lernkurve kann für Entwickler schwierig sein, wenn sie nicht genau wissen, was gleichzeitige Ausführung eigentlich bedeutet.Dennoch ist es weitaus weniger schwierig, als irgendeine Art von Multithread-Code mit Sperren zu schreiben.
  • Nachteil:Wenn eine rechenintensive Anfrage beispielsweise 100 ms lang ausgeführt wird, wird die Verarbeitung anderer Anfragen blockiert, die im selben Node.js-Prozess verarbeitet werden ...AKA, kooperatives Multitasking.Dies kann mit dem Web Workers-Muster (Ausgliederung eines Unterprozesses zur Bewältigung der teuren Aufgabe) abgemildert werden.Alternativ könnten Sie eine große Anzahl von Node.js-Workern verwenden und jedem nur eine einzige Anfrage gleichzeitig bearbeiten lassen (immer noch ziemlich effizient, da es keine Prozesswiederverwertung gibt).
  • Nachteil:Der Betrieb eines Produktionssystems ist VIEL komplizierter als ein CGI Modell wie Apache + PHP, Perl, Rubin, usw.Nicht behandelte Ausnahmen führen zum Abbruch des gesamten Prozesses und erfordern eine Logik zum Neustart fehlgeschlagener Worker (siehe Cluster).Module mit fehlerhaftem nativem Code können den Prozess stark zum Absturz bringen.Wenn ein Worker stirbt, werden alle von ihm verarbeiteten Anfragen verworfen, sodass eine fehlerhafte API leicht den Dienst für andere gemeinsam gehostete APIs beeinträchtigen kann.

Im Vergleich zum Schreiben eines „echten“ Dienstes in Java / C# / C (C?Wirklich?)

  • Profi:Asynchrones Arbeiten in Node.js ist einfacher als Thread-Sicherheit anderswo und bietet wohl einen größeren Nutzen.Node.js ist bei weitem das am wenigsten schmerzhafte asynchrone Paradigma, mit dem ich je gearbeitet habe.Bei guten Bibliotheken ist es nur geringfügig schwieriger als das Schreiben von synchronem Code.
  • Profi:Keine Multithreading-/Sperrfehler.Es stimmt, Sie investieren im Vorfeld in das Schreiben ausführlicheren Codes, der einen ordnungsgemäßen asynchronen Workflow ohne blockierende Vorgänge zum Ausdruck bringt.Und Sie müssen einige Tests schreiben und das Ding zum Laufen bringen (es ist eine Skriptsprache und fette Fingering-Variablennamen werden nur zum Zeitpunkt des Unit-Tests erfasst).ABER, sobald Sie es zum Laufen gebracht haben, ist die Oberfläche für Heisenbugs – seltsame Probleme, die nur einmal in einer Million Läufen auftreten – diese Oberfläche ist einfach viel, viel kleiner.Die Steuern, die Node.js-Code schreiben, werden stark in die Codierungsphase eingebunden.Dann erhalten Sie tendenziell stabilen Code.
  • Profi:JavaScript ist viel einfacher, um Funktionalität auszudrücken.Es ist schwer, dies mit Worten zu beweisen, aber JSON, dynamische Typisierung, Lambda-Notation, prototypische Vererbung, leichte Module, was auch immer ...Es ist lediglich tendenziell weniger Code erforderlich, um dieselben Ideen auszudrücken.
  • Nachteil:Vielleicht mögen Sie Programmierdienste in Java wirklich sehr?

Eine weitere Perspektive auf JavaScript und Node.js finden Sie hier Von Java zu Node.js, ein Blogbeitrag über die Eindrücke und Erfahrungen eines Java-Entwicklers beim Erlernen von Node.js.


ModuleBedenken Sie bei der Auswahl eines Knotens, dass dies bei Ihrer Wahl der JavaScript-Bibliotheken der Fall sein wird DEFINIEREN Deine Erfahrung.Die meisten Leute verwenden mindestens zwei, einen asynchronen Musterhelfer (Step, Futures, Async) und ein JavaScript-Zuckermodul (Underscore.js).

Helfer / JavaScript Sugar:

  • Underscore.js - benutze das.Tun Sie es einfach.Es macht Ihren Code mit Dingen wie _.isString() und _.isArray() schön und lesbar.Ich bin mir nicht wirklich sicher, wie man sonst sicheren Code schreiben könnte.Weitere Informationen zu erweitertem Befehlszeilen-Fu finden Sie auch in meinem eigenen Unterstrich-CLI.

Asynchrone Mustermodule:

  • Schritt - eine sehr elegante Möglichkeit, Kombinationen aus seriellen und parallelen Aktionen auszudrücken.Meine persönliche Empfehlung.Sehen mein Post wie der Step-Code aussieht.
  • Futures - Viel flexiblere Möglichkeit (ist das wirklich eine gute Sache?), Bestellung durch Anforderungen auszudrücken.Kann Dinge wie „starte a, b, c parallel“ ausdrücken.Wenn A und B fertig sind, beginnen Sie mit AB.Wenn A und C fertig sind, starten Sie AC.“ Eine solche Flexibilität erfordert mehr Sorgfalt, um Fehler in Ihrem Workflow zu vermeiden (z. B. niemals oder mehrmals den Rückruf aufzurufen).Sehen Raynos' Beitrag über die Verwendung von Futures (dies ist der Beitrag, der mich dazu gebracht hat, Futures zu „bekommen“).
  • Asynchron - Traditionellere Bibliothek mit einer Methode für jedes Muster.Damit begann ich vor meiner religiösen Konvertierung zu Step und der anschließenden Erkenntnis, dass alle Muster in Async in Step mit einem einzigen, besser lesbaren Paradigma ausgedrückt werden könnten.
  • TameJS – Geschrieben von OKCupid, handelt es sich um einen Precompiler, der einen neuen Sprachprimativ „await“ zum eleganten Schreiben serieller und paralleler Arbeitsabläufe hinzufügt.Das Muster sieht toll aus, erfordert aber eine Vorkompilierung.Darüber bin ich immer noch am Überlegen.
  • StreamlineJS - Konkurrent von TameJS.Ich neige zu Tame, aber Sie können sich Ihre eigene Meinung bilden.

Oder um alles über die asynchronen Bibliotheken zu lesen, siehe dieses Panel-Interview mit den Autoren.

Web-Framework:

  • Äußern Tolles Ruby on Rails-esk-Framework zum Organisieren von Websites.Es benutzt JADE als XML/HTML-Template-Engine, die das Erstellen von HTML weitaus weniger mühsam, ja fast elegant macht.
  • jQuery Obwohl jQuery technisch gesehen kein Knotenmodul ist, entwickelt es sich schnell zu einem De-facto-Standard für clientseitige Benutzeroberflächen.jQuery bietet CSS-ähnliche Selektoren zum „Abfragen“ von Sätzen von DOM-Elementen, die dann bearbeitet werden können (Satzhandler, Eigenschaften, Stile usw.).In die gleiche Richtung geht auch Twitter Bootstrap CSS-Framework, Backbone.js für ein MVC Muster und Browserify.js um alle Ihre JavaScript-Dateien in einer einzigen Datei zusammenzufassen.Diese Module werden alle zu De-facto-Standards, Sie sollten sie sich also zumindest ansehen, wenn Sie noch nie davon gehört haben.

Testen:

  • JSHint - Benutzen müssen;Ich habe dies zunächst nicht verwendet, was jetzt unverständlich erscheint.JSLint fügt eine Reihe grundlegender Überprüfungen hinzu, die Sie mit einer kompilierten Sprache wie Java erhalten.Nicht übereinstimmende Klammern, nicht deklarierte Variablen, Tippfehler in vielen Formen und Größen.Sie können auch verschiedene Formen des sogenannten „Analmodus“ aktivieren, in dem Sie den Stil von Leerzeichen und so weiter überprüfen. Das ist in Ordnung, wenn das Ihr Ding ist – aber der wahre Wert liegt darin, dass Sie sofort eine Rückmeldung über die genaue Zeilennummer erhalten, wo du hast ein abschließendes ")" vergessen ...ohne dass Sie Ihren Code ausführen und die fehlerhafte Zeile erreichen müssen.„JSHint“ ist eine besser konfigurierbare Variante von Douglas Crockford'S JSLint.
  • Mokka Konkurrent von Vows, den ich langsam bevorzuge.Beide Frameworks beherrschen die Grundlagen recht gut, komplexe Muster lassen sich in Mocha jedoch tendenziell einfacher ausdrücken.
  • Gelübde Vows ist wirklich ziemlich elegant.Und es druckt einen schönen Bericht (--spec) aus, der Ihnen zeigt, welche Testfälle bestanden/fehlgeschlagen sind.Nehmen Sie sich 30 Minuten Zeit, um es zu erlernen, und Sie können mit minimalem Aufwand grundlegende Tests für Ihre Module erstellen.
  • Zombie - Headless-Testen für HTML und JavaScript mit JSDom als virtueller „Browser“.Sehr mächtiges Zeug.Kombinieren Sie es mit Wiederholung um blitzschnelle deterministische Tests von In-Browser-Code zu erhalten.
  • Ein Kommentar dazu, wie man über Tests „nachdenkt“:
    • Das Testen ist nicht optional.Bei einer dynamischen Sprache wie JavaScript gibt es solche sehr wenige statische Kontrollen.Wenn Sie beispielsweise zwei Parameter an eine Methode übergeben, die 4 erwartet, wird dies erst dann funktionieren, wenn der Code ausgeführt wird.Ziemlich niedrige Messlatte für die Entstehung von Fehlern in JavaScript.Grundlegende Tests sind unerlässlich, um die Verifizierungslücke bei kompilierten Sprachen zu schließen.
    • Vergessen Sie die Validierung, lassen Sie Ihren Code einfach ausführen.Für jede Methode lautet mein erster Validierungsfall „Nichts geht kaputt“, und das ist der Fall, der am häufigsten ausgelöst wird.Der Nachweis, dass Ihr Code ohne Auslösen ausgeführt wird, fängt 80 % der Fehler ab und trägt so viel zur Verbesserung Ihrer Codesicherheit bei, dass Sie feststellen müssen, dass Sie zurückgehen und die nuancierten Validierungsfälle hinzufügen, die Sie übersprungen haben.
    • Fangen Sie klein an und durchbrechen Sie die Trägheitsbarriere.Wir sind alle faul und unter Zeitdruck, und es ist leicht, Tests als „zusätzliche Arbeit“ zu betrachten.Fangen Sie also klein an.Schreiben Sie Testfall 0 – laden Sie Ihr Modul und melden Sie den Erfolg.Wenn Sie sich dazu zwingen, genau so viel zu tun, wird die Trägheitsbarriere des Testens durchbrochen.Das sind weniger als 30 Minuten für die erste Durchführung, einschließlich des Lesens der Dokumentation.Schreiben Sie nun Testfall 1 – rufen Sie eine Ihrer Methoden auf und stellen Sie sicher, dass „nichts kaputt geht“, d. h., dass Sie keinen Fehler zurückerhalten.Testfall 1 sollte weniger als eine Minute dauern.Wenn die Trägheit weg ist, können Sie Ihre Testabdeckung ganz einfach schrittweise erweitern.
    • Entwickeln Sie nun Ihre Tests mit Ihrem Code weiter.Lassen Sie sich nicht davon einschüchtern, wie der „richtige“ End-to-End-Test mit Scheinservern und all dem aussehen würde.Der Code beginnt einfach und entwickelt sich weiter, um neue Fälle zu bewältigen.Tests sollten auch.Wenn Sie Ihrem Code neue Fälle und neue Komplexität hinzufügen, fügen Sie Testfälle hinzu, um den neuen Code auszuprobieren.Wenn Sie Fehler finden, fügen Sie Überprüfungen und/oder neue Fälle hinzu, um den fehlerhaften Code abzudecken.Wenn Sie beim Debuggen das Vertrauen in einen Code verlieren, gehen Sie zurück und fügen Sie Tests hinzu, um zu beweisen, dass er das tut, was Sie denken.Erfassen Sie Zeichenfolgen mit Beispieldaten (von anderen von Ihnen aufgerufenen Diensten, von Websites, die Sie durchsuchen, was auch immer) und geben Sie sie an Ihren Parsing-Code weiter.Ein paar Fälle hier, eine verbesserte Validierung dort, und am Ende erhalten Sie äußerst zuverlässigen Code.

Schauen Sie sich auch die an offizielle Liste der empfohlenen Node.js-Module.Jedoch, GitHubs Knotenmodul-Wiki ist viel vollständiger und eine gute Ressource.


Um Node zu verstehen, ist es hilfreich, einige der wichtigsten Designentscheidungen zu berücksichtigen:

Node.js ist EREIGNISBASIERT Und ASYNCHRON / NICHT-BLOCKIEREND.Ereignisse wie eine eingehende HTTP-Verbindung lösen eine JavaScript-Funktion aus, die ein wenig Arbeit erledigt und andere asynchrone Aufgaben auslöst, z. B. das Herstellen einer Verbindung zu einer Datenbank oder das Abrufen von Inhalten von einem anderen Server.Sobald diese Aufgaben gestartet wurden, wird die Ereignisfunktion beendet und Node.js geht wieder in den Ruhezustand.Sobald etwas anderes passiert, etwa die Herstellung der Datenbankverbindung oder die Antwort des externen Servers mit Inhalten, werden die Rückruffunktionen ausgelöst und mehr JavaScript-Code ausgeführt, wodurch möglicherweise noch mehr asynchrone Aufgaben (wie eine Datenbankabfrage) ausgelöst werden.Auf diese Weise verschachtelt Node.js problemlos Aktivitäten für mehrere parallele Workflows und führt alle Aktivitäten aus, die zu jedem Zeitpunkt freigegeben sind.Aus diesem Grund leistet Node.js so hervorragende Arbeit bei der Verwaltung Tausender gleichzeitiger Verbindungen.

Warum nicht einfach einen Prozess/Thread pro Verbindung wie alle anderen verwenden? In Node.js ist eine neue Verbindung nur eine sehr kleine Heap-Zuweisung.Das Starten eines neuen Prozesses benötigt deutlich mehr Speicher, auf manchen Plattformen ein Megabyte.Die tatsächlichen Kosten sind jedoch der mit dem Kontextwechsel verbundene Mehraufwand.Wenn Sie 10^6 Kernel-Threads haben, muss der Kernel viel Arbeit leisten, um herauszufinden, wer als Nächstes ausgeführt werden soll.In die Erstellung eines O(1)-Schedulers für Linux wurde eine Menge Arbeit gesteckt, aber am Ende ist es einfach viel effizienter, einen einzelnen ereignisgesteuerten Prozess zu haben als 10^6 Prozesse, die um CPU-Zeit konkurrieren.Außerdem verhält sich das Multiprozessmodell unter Überlastbedingungen sehr schlecht, wodurch wichtige Verwaltungs- und Verwaltungsdienste, insbesondere SSHD, ausgehungert werden (was bedeutet, dass Sie sich nicht einmal bei der Box anmelden können, um herauszufinden, wie beschissen es wirklich ist).

Node.js ist EINFACH GEWINDE Und SCHLOSSFREI.Node.js hat als sehr bewusste Designentscheidung nur einen einzigen Thread pro Prozess.Aus diesem Grund ist es grundsätzlich unmöglich, dass mehrere Threads gleichzeitig auf Daten zugreifen.Somit sind keine Sperren erforderlich.Threads sind hart.Wirklich sehr schwer.Wenn Sie das nicht glauben, haben Sie nicht genug Thread-Programmierung durchgeführt.Das richtige Sperren ist schwierig und führt zu Fehlern, die nur schwer aufzuspüren sind.Durch die Eliminierung von Sperren und Multithreading verschwindet eine der schlimmsten Fehlerklassen einfach.Dies könnte der größte Vorteil von Node sein.

Aber wie nutze ich die Vorteile meiner 16-Kern-Box?

Zwei Wege:

  1. Für große Rechenaufgaben wie die Bildkodierung kann Node.js untergeordnete Prozesse starten oder Nachrichten an zusätzliche Arbeitsprozesse senden.In diesem Design hätten Sie einen Thread, der den Fluss von Ereignissen verwaltet, und N Prozesse, die schwere Rechenaufgaben erledigen und die anderen 15 CPUs beanspruchen.
  2. Um den Durchsatz eines Webservices zu skalieren, sollten Sie mehrere Node.js-Server auf einer Box ausführen, einen pro Kern Cluster (Mit Node.js v0.6.x ersetzt das hier verlinkte offizielle „Cluster“-Modul die Learnboost-Version, die über eine andere API verfügt.)Diese lokalen Node.js-Server können dann auf einem Socket konkurrieren, um neue Verbindungen zu akzeptieren und so die Last auf sie auszugleichen.Sobald eine Verbindung akzeptiert wird, wird sie eng an einen einzelnen dieser gemeinsamen Prozesse gebunden.Theoretisch klingt das schlecht, aber in der Praxis funktioniert es recht gut und ermöglicht es Ihnen, die Kopfschmerzen beim Schreiben von threadsicherem Code zu vermeiden.Dies bedeutet auch, dass Node.js eine hervorragende CPU-Cache-Affinität erhält und die Speicherbandbreite effektiver nutzt.

Mit Node.js können Sie einige wirklich leistungsstarke Dinge tun, ohne ins Schwitzen zu geraten. Angenommen, Sie haben ein Node.js-Programm, das eine Vielzahl von Aufgaben erledigt und auf a lauscht TCP Port für Befehle, kodiert einige Bilder, was auch immer.Mit fünf Codezeilen können Sie ein HTTP-basiertes Webverwaltungsportal hinzufügen, das den aktuellen Status aktiver Aufgaben anzeigt.Das geht EINFACH:

var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end(myJavascriptObject.getSomeStatusInfo());
}).listen(1337, "127.0.0.1");

Jetzt können Sie eine URL aufrufen und den Status Ihres laufenden Prozesses überprüfen.Fügen Sie ein paar Schaltflächen hinzu und Sie haben ein „Verwaltungsportal“.Wenn Sie ein laufendes Perl-/Python-/Ruby-Skript haben, ist es nicht ganz einfach, einfach ein Verwaltungsportal einzubauen.

Aber ist JavaScript nicht langsam / schlecht / böse / Teufelsbrut? JavaScript hat einige seltsame Eigenheiten, aber mit den „guten Teilen“ gibt es eine sehr mächtige Sprache, und auf jeden Fall ist JavaScript DIE Sprache auf dem Client (Browser).JavaScript ist hier, um zu bleiben;Andere Sprachen zielen darauf als IL ab, und erstklassige Talente konkurrieren um die Entwicklung der fortschrittlichsten JavaScript-Engines.Aufgrund der Rolle von JavaScript im Browser wird ein enormer technischer Aufwand betrieben, um JavaScript blitzschnell zu machen. V8 ist die neueste und beste Javascript-Engine, zumindest für diesen Monat.Es übertrifft die anderen Skriptsprachen sowohl in der Effizienz als auch in der Stabilität (ich sehe dich an, Ruby).Und es wird nur noch besser, wenn riesige Teams bei Microsoft, Google und Mozilla an dem Problem arbeiten und um die Entwicklung der besten JavaScript-Engine konkurrieren (es ist kein JavaScript-„Interpreter“ mehr, wie alle modernen Engines Unmengen davon leisten). JIT Kompilieren unter der Haube mit Interpretation nur als Fallback für Code, der nur einmal ausgeführt werden kann.Ja, wir alle wünschten, wir könnten ein paar der seltsameren JavaScript-Sprachoptionen korrigieren, aber so schlimm ist es wirklich nicht.Und die Sprache ist so verdammt flexibel, dass Sie wirklich nicht JavaScript programmieren, sondern Step oder jQuery – mehr als jede andere Sprache definieren in JavaScript die Bibliotheken das Erlebnis.Um Webanwendungen zu erstellen, müssen Sie ohnehin so gut wie JavaScript beherrschen, sodass das Codieren damit auf dem Server eine Art Synergie bei den Fähigkeiten mit sich bringt.Es hat mir keine Angst mehr gemacht, Client-Code zu schreiben.

Wenn Sie JavaScript WIRKLICH hassen, können Sie außerdem syntaktischen Zucker verwenden CoffeeScript.Oder irgendetwas anderes, das JavaScript-Code erstellt, z Google Web Toolkit (GWT).

Apropos JavaScript: Was ist ein „Abschluss“? – Ziemlich schick ausgedrückt, dass Sie lexikalisch gültige Variablen über Aufrufketten hinweg beibehalten.;) So was:

var myData = "foo";
database.connect( 'user:pass', function myCallback( result ) {
    database.query("SELECT * from Foo where id = " + myData);
} );
// Note that doSomethingElse() executes _BEFORE_ "database.query" which is inside a callback
doSomethingElse();

Sehen Sie, wie Sie „myData“ einfach verwenden können, ohne etwas Umständliches wie das Verstauen in einem Objekt zu tun?Und anders als in Java muss die Variable „myData“ nicht schreibgeschützt sein.Diese leistungsstarke Sprachfunktion macht die asynchrone Programmierung viel weniger ausführlich und weniger mühsam.

Das Schreiben von asynchronem Code wird immer komplexer sein als das Schreiben eines einfachen Single-Threaded-Skripts, aber mit Node.js ist es nicht viel schwieriger und Sie erhalten neben der Effizienz und Skalierbarkeit für Tausende gleichzeitiger Verbindungen viele Vorteile. ..

V8 ist eine Implementierung von JavaScript. Damit können Sie Standalone-JavaScript-Anwendungen (unter anderem) ausgeführt werden.

Node.js ist einfach eine Bibliothek für V8 geschrieben, die evented I / O der Fall ist. Dieses Konzept ein bisschen schwieriger ist, zu erklären, und ich bin sicher, dass jemand mit einer besseren Erklärung beantworten, als ich ... Der Kern ist, dass anstatt einige Ein- oder Ausgang zu tun und warten, dass es geschehen kann, Sie nur don ‚t warten, bis es fertig zu stellen. So zum Beispiel, fragen Sie nach der letzten Mal Zeit einer Datei:

// Pseudo code
stat( 'somefile' )

Das könnte ein paar Millisekunden dauern, oder es könnte Sekunden dauern. Mit evented I / O Sie einfach die Anfrage abfeuern und stattdessen um Sie zu warten, befestigen ein Rückruf, der ausgeführt wird, wenn die Anforderung beendet:

// Pseudo code
stat( 'somefile', function( result ) {
  // Use the result here
} );
// ...more code here

Dies macht es viel wie JavaScript-Code im Browser (zum Beispiel mit Ajax Stil-Funktionalität).

Für weitere Informationen sollten Sie den Artikel überprüfen Node.js ist wirklich spannende , die meine Einführung in die Bibliothek / Plattform war ... ich fand es recht gut.

Node.js ist ein Open-Source-Kommandozeilen-Tool für die Server-Seite JavaScript-Code gebaut. Sie können laden Sie eine Tarball , kompilieren und die Quelle installieren. Damit können Sie JavaScript-Programme ausführen.

Der JavaScript wird durch die V8 , eine JavaScript-Engine von Google entwickelt, die verwendet wird in Chrome Browser. Es verwendet einen JavaScript-API auf das Netzwerk und das Dateisystem zugreifen zu können.

Es ist bekannt für seine Leistung und die Fähigkeit, parallele Operationen auszuführen.

  

node.js Legendes ist die beste Erklärung von node.js ich habe bisher gefunden.

Im Folgenden sind einige gute Artikel zum Thema.

  

Die Verschlüsse sind eine Möglichkeit, Code im Kontext auszuführen es erstellt wurde.

Was bedeutet dies für concurency ist, dass Sie Variablen definieren können, initiieren dann eine nicht-blockierende I / O Funktion, und es eine anonyme Funktion für seinen Rückruf senden.

Wenn die Aufgabe abgeschlossen ist, die Callback-Funktion im Zusammenhang mit den Variablen ausgeführt wird, ist dies die Schließung ist.

Der Grund Verschlüsse so gut sind für das Schreiben von Anwendungen mit nicht-blockierenden I / O ist, dass es sehr einfach, den Zusammenhang von Funktionen asynchron ausführen zu verwalten.

Zwei gute Beispiele sind darüber, wie Sie Vorlagen zu verwalten und verwenden progressive Verbesserungen mit sich. Sie müssen nur ein paar leichten Stücke von JavaScript-Code, um es perfekt zu arbeiten.

ich empfehlen, dass Sie diese Artikel sehen und lesen:

jede Sprache aufnehmen und versuchen, sich daran zu erinnern, wie Sie Ihre HTML-Datei Vorlagen verwalten würde und was man einen einzelnen zu aktualisieren zu tun hatte, CSS Klassennamen in Ihrem DOM Struktur (zum Beispiel einen Benutzer auf einen Menüpunkt geklickt und Sie möchten, dass als „ausgewählt“ markiert und der Inhalt der Seite) aktualisieren.

Mit Node.js ist es so einfach wie es in clientseitige JavaScript-Code zu tun. Holen Sie sich Ihren DOM-Knoten und anwenden, um Ihre CSS-Klasse zu, dass. Holen Sie sich Ihren DOM-Knoten und innerHTML- Ihre Inhalte (Sie werden einige zusätzliche JavaScript-Code, um dies zu tun. Lesen Sie den Artikel um mehr zu erfahren).

Ein weiteres gutes Beispiel ist, dass Sie Ihre Webseite kompatibel machen können sowohl mit JavaScript ein- oder ausgeschaltet mit dem gleichen Stück Code. Stellen Sie sich eine aktuelle Auswahl in JavaScript gemacht haben, die Ihre Benutzer ein beliebiges Datum zu holen erlauben würde, einen Kalender verwenden. Sie können (oder verwenden), um das gleiche Stück JavaScript-Code schreiben, damit es funktioniert mit Ihrem JavaScript eingeschaltet oder ausgeschaltet.

Es ist eine sehr gute Fastfood Analogie, die das ereignisgesteuerte Modell von Node.js am besten erklärt, sehen Sie den vollständigen Artikel, Node.js, Büros und Fast Food Restaurants der Doktors - Verständnis ereignisgesteuerte Programmierung

Hier ist eine Zusammenfassung:

  

Wenn die Schnellimbißverbindung ein traditionelles Thread-basiertes Modell gefolgt, würden Sie Ihr Essen bestellen und in der Schlange warten, bis Sie sie erhalten haben. Die Person hinter Ihnen nicht in der Lage sein, um zu bestellen, bis Ihre Bestellung durchgeführt wurde. In einem ereignisgesteuerten Modell und bestellen Sie Ihr Essen und dann raus aus der Schlange zu warten. Jeder andere ist dann frei, um zu bestellen.

Node.js ist ereignisgesteuert, aber die meisten Web-Server sind Thread-based.York erklärt, wie Node.js funktioniert:

  • Sie nutzen Ihren Web-Browser eine Anfrage für „/about.html“ auf einem machen Node.js Webserver.

  • Der Node.js Server nimmt die Anforderung und ruft eine Funktion zum Abrufen die Datei von der Festplatte.

  • Während die Node.js-Server für die Datei wartet auf, es abgerufen werden Dienste der nächste Web-Anfrage.

  • Wenn die Datei abgerufen wird, gibt es eine Callback-Funktion, die ist in der Node.js Server-Warteschlange eingefügt.

  • Der Node.js-Server führt die Funktion des in diesem Fall würde machen die "/about.html" Seite und senden Sie es an Ihren Web-Browser zurück. "

Nun, Ich verstehe, dass

  
      
  • Node Ziel ist es, eine einfache Möglichkeit,   skalierbare Netzwerk-Programme zu bauen.
  •   
  • Knoten ist ähnlich im Design und durch Systeme wie Rubys Ereignis Maschine oder Pythons verdrehtes beeinflusst.
  •   
  • Evented I / O für V8 Javascript.
  •   

Für mich bedeutet, dass Sie in allen drei Annahmen richtig waren. Die Bibliothek sicher, sieht vielversprechend aus!

Auch vergessen Sie nicht zu erwähnen, dass Googles V8 sehr schnell ist. Er wandelt tatsächlich den JavaScript-Code in Maschinencode mit der angepassten Leistung von kompilierte binär. So zusammen mit all den anderen Dingen, es ist wahnsinnig schnell.

Q:Das Programmiermodell ist ereignisgesteuert, insbesondere die Art und Weise, wie es funktioniert E/A.

Richtig.Es verwendet Rückrufe, sodass jede Anfrage zum Zugriff auf das Dateisystem dazu führt, dass eine Anfrage an das Dateisystem gesendet wird und Node.js dann mit der Verarbeitung seiner nächsten Anfrage beginnt.Es würde sich erst dann um die E/A-Anfrage kümmern, wenn es eine Antwort vom Dateisystem erhält und zu diesem Zeitpunkt den Rückrufcode ausführt.Es ist jedoch möglich, synchrone E/A-Anfragen (also blockierende Anfragen) zu stellen.Es liegt am Entwickler, zwischen asynchron (Rückrufe) und synchron (wartend) zu wählen.

Q:Es verwendet JavaScript und der Parser ist V8.

Ja

Q:Es kann problemlos zum Erstellen gleichzeitiger Serveranwendungen verwendet werden.

Ja, obwohl Sie ziemlich viel JavaScript von Hand programmieren müssten.Es könnte besser sein, sich ein Framework anzusehen, z http://www.easynodejs.com/ - inklusive vollständiger Online-Dokumentation und einer Beispielanwendung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top