Passt node.js gut zur Hintergrundverarbeitung?

10

Ich lerne langsam node.jsund habe ein kleines Projekt, das ich starten möchte. Das Projekt wird viele Hintergrundprozesse haben (Herunterladen von Daten von externen Sites, Parsen von CSV-Dateien usw.).

Ein großer "Gewinn" für mich und den Knoten ist die Tatsache, dass JavaScript sowohl für den Client als auch für den Server verwendet wird. Ich programmiere in meinem Tagesjob in Java und JavaScript, bin aber auch ziemlich gut in Ruby.

Aber wie gesagt, es scheint attraktiv, überall eine Sprache zu verwenden, und JS scheint dieser Rechnung zu entsprechen.

Ich habe jedoch nicht viel Erfahrung mit der Verwendung von JS zum Ausführen von Hintergrundjobs. Ruby scheint sich darin zu übertreffen. Und ich bin nicht dagegen, es zu benutzen. Also, was denkst du darüber, 100% JS dafür zu machen? Mir ist klar, dass sehr große Projekte kundenspezifische Lösungen erfordern. Ich frage mich nur, ob sich die Mühe lohnt. Oder sollte ich mich bei solchen Aufgaben einfach an Ruby halten?

Meinungen geschätzt.

Vielen Dank

cbmeeks
quelle
Möglicherweise möchten Sie auch vert.x als Alternative zum Knoten betrachten.
Mike

Antworten:

13

Es ist besonders gut im Umgang mit einer Tonne Datei-E / A und ich würde erwarten, dass es auch eine Tonne Netzwerkkommunikation gut handhabt. Es scheint besonders beliebt für Socket-gesteuerte Apps zu sein. Das Wichtigste ist, dass Sie möglicherweise in ein C eintauchen müssen, das an JS-Befehle gebunden werden kann, wenn Ihre Anforderungen nicht von vorhandenen Bibliotheken erfüllt werden (es gibt viele). Sie können auch zusätzliche Knotenprozesse erzeugen, aber ich vermute, dass eine Menge davon zu Steuern führen kann (ich gehe davon aus - möglicherweise falsch -, dass für jede dieser Prozesse eine V8-Instanz erzeugt wird).

JS ist Single-Threaded und blockiert, was bedeutet, dass nichts anderes ausgeführt werden kann, bis ein Funktionsaufruf abgeschlossen ist. Dies war eine erwünschte Funktion von JS, die im Wesentlichen alle Threading- und Warteschlangenprobleme aus Ihren Händen nahm. Das JS hindert das C / C ++ - Zeug nicht daran, unter der Haube mehr Multithreading auszuführen, sodass JS wirklich mehr Architektur / Messenger ist. Wenn Sie Bilder verarbeiten, möchten Sie dies nicht mit synchronen JavaScript-Befehlen behandeln, da alles andere auf Ihrer App oder Ihrem Server blockiert wird, bis es fertig ist. Die Idee ist, dass Sie ein Bild aufrufen, das von gebundenen C / C ++ - Funktionen verarbeitet werden soll, und dann auf das Ereignis "Fertig" reagieren, wenn das Bild fertig verarbeitet ist.

Dies erfordert, dass der JS in einer Node.js-App stark ereignis- und rückrufgesteuert ist, da er sonst wahrscheinlich eine sehr schlechte Leistung erbringt. Daher werden in Node nicht viele Methodenaufrufe angezeigt, denen keine Funktion zur späteren Verwendung übergeben wird. Eine Sache, die in Node sehr schnell klar wird, ist, dass Sie sich in einer Welt der Hässlichkeit befinden, wenn Sie keinen Weg finden, mit der Rückrufpyramide umzugehen. z.B

//event CBs are more DOM-style than Node style and this isn't built-in Node file I/O
//keeping it simple and quick since I'll just get Node stuff wrong from memory
file.get('someFile.txt', function(e){
    e.fileObj.find('some snippet', function(e){
        someFinalCallBackHandler( e.snippetLocations );
    } );
} );

Glücklicherweise gibt es viele Tools und Beispiele, um dies besser zu handhaben. Die meisten drehen sich in der Regel um Versprechensmechanismen und verketten einfach eine Reihe von Funktionen, die auf die Rückrufzustände des anderen in einem Array reagieren sollen, das die hässlichen Pyramiden für Sie unter der Haube erledigt.

Persönlich finde ich es verdammt toll, dass wir JS auf hohem Niveau und C / C ++ näher am Chrom haben. Es ist die ultimative Kombination und hat mich dazu inspiriert, C zu lernen. Und lassen Sie sich nicht vom Mangel an Bibliothekspotential ausflippen, bis Sie einige Nachforschungen angestellt haben. Knotenbibliotheken werden sehr schnell erstellt und reifen sehr schnell. Wenn Sie nichts tun, sind ungewöhnliche Chancen gut, dass jemand sie abgedeckt hat.

Der größte Unterschied zu Rails besteht darin, dass JS wahrscheinlich nie sozusagen auf Schienen ist. Wir neigen dazu, zu codieren, um es haben zu können, aber Sie wollen es sehr schnell, so dass es das Seil gibt, mit dem Sie sich aufhängen können, und Architektur war in JS bis in die letzten Jahre ziemlich DIY. Ich nenne das Freiheit, aber mir ist klar, dass dies für viele Entwickler nicht ideal ist.

Außerdem werden Sie in Node.js niemals ein "Juwel" -Problem haben, weil Sie versucht haben, es auf etwas anderem als einem Mac zu installieren. Clientseitige Webentwickler verachten Abhängigkeitsprobleme, und daher kommt ein Großteil des Kerns von Node. Wenn es auf jeder gängigen Plattform nicht innerhalb von 5 Minuten oder weniger sofort funktioniert, zerknüllen wir es im Allgemeinen und werfen es weg. Ich habe noch kein beliebtes Modul gefunden, für das ich etwas Besonderes tun musste, damit es funktioniert. Das Paketsystem ist ausgezeichnet.

Aber um Ihre Kernfrage expliziter / prägnanter zu beantworten: Ist es gut mit Hintergrundprozessen?

Ja, Node IS-Hintergrundprozesse mit dem Mittel, eine App über Ereignisse und Rückrufe zu steuern.

Erik Reppen
quelle
1
Hier gibt es viele allgemeine Informationen, aber Sie haben nichts über die Fähigkeit von node.js gesagt, Anforderungen asynchron zu verarbeiten.
Robert Harvey
Guter Punkt. Ich werde mich dort etwas mehr konzentrieren.
Erik Reppen
Als ehemaliger Rails-Entwickler und ein halb erfahrener Node.js-Entwickler bin ich definitiv nicht einverstanden mit dem Vergleich des Paketsystems zwischen Ruby / Rails-Welt und JS / Node.js-Welt, den Erik gemacht hat. Jeder erfahrene (oder sogar nicht erfahrene) Rails-Entwickler weiß, dass "Edelsteine" buchstäblich wie Edelsteine ​​sind. Sie arbeiten mühelos. Die meisten von ihnen sind gut getestet, robust und stabil. Mehr als die Hälfte der NPM-Module ist jedoch schlecht konzipiert, nicht getestet und sogar nicht fertiggestellt. Zum Beispiel kann mir niemand JS-Ersatz von Devise oder Paperclip mit genau der gleichen Qualität und Funktionsvielfalt zeigen. Auf keinen Fall.
Scaryguy
Das war nicht meine Erfahrung auf etwas anderem als einem Mac. Trotzdem bin ich von der OS-Kompatibilität Ihres typischen Knotenmoduls weniger beeindruckt als früher. Ich bin mir nicht sicher, ob ich mit Erfahrung auf mehr schlechte Eier gestoßen bin oder ob die Community auf viele Entwickler angewachsen ist, die plattformübergreifend nicht so ernst nehmen, wie sie sollten. Aber es gibt definitiv Linux-Snobismus.
Erik Reppen
Diese Antwort verdient so viele positive Stimmen
Amin Mohamed Ajani
2

Ein Problem, das Sie beachten sollten, ist das, was bei der Verarbeitung großer Dateien in einer asynchronen Umgebung auftritt : Wenn Ihr Eingabestream (eine Datei) schneller als Ihr Ausgabestream (die Datenbank) ist, können Sie die Eingabedatenereignisse nicht schnell verarbeiten genug. Dies wird entweder einen Teil Ihres Systems (Ausgabestream oder Speicher) überfordern oder dazu führen, dass Sie Daten verlieren. Aus diesem Grund kann die asynchrone Datenverarbeitung etwas schwierig sein. Wie der Artikel, auf den ich verlinkt habe, erklärt, ermöglicht die Möglichkeit, den Eingabestream anzuhalten, das Drosseln auf eine Weise, die Ihrer Situation entspricht.


quelle
1

Node.js zeichnet sich bei IO aus. Es ist sehr unwahrscheinlich, dass Sie eines Tages feststellen, dass Ihr Prozess blockiert ist, da die meisten Ihrer Threads in SQL-Aufrufen blockieren.

Allerdings ist node.js bei rechnergebundener Arbeit wirklich schlecht . Wenn ich "viel IO" höre, denke ich "yeah! Go node!", Aber wenn ich "parsing" höre, zögere ich ein wenig. Ich bin mir nicht sicher, ob dies aus irgendeinem Grund der Fall ist, außer dass Leute den Knoten nicht richtig multithreading, aber bis jetzt findet die gesamte rechnergebundene Arbeit meines Produkts außerhalb des Knotens statt.

Multithreading in node.js ist schwierig einzurichten. Standardmäßig ist alles Single-Threaded und der meiste Code wird unter der Annahme geschrieben, dass er nur unter einem Thread ausgeführt wird. Sie müssen auf jeden Fall Domänen verwenden , um zu verhindern, dass ein Fehler in einem Thread Ihre gesamte Anwendung zum Erliegen bringt.

Beachten Sie auch, dass der Knoten in einigen Unternehmensfunktionen möglicherweise etwas schwächer ist. Beispielsweise sind die Protokollierungsbibliotheken nicht mit denen von Java vergleichbar. Derzeit gibt es kein gutes Protokollierungsframework, das sogar MDC unterstützt, was in der Praxis bedeutet, dass Sie viel tun müssen var logPrefix = userId + ": ".

Ich habe auch noch nie ein privates npm-Repo ausgeführt. Je nachdem, ob Ihr Code proprietär ist, benötigen Sie möglicherweise eines davon.

Djechlin
quelle
1

Wenn Ihre Hintergrundprozesse nacheinander ausgeführt werden können, kann dies ziemlich gut sein. In meiner letzten Position musste ich eine Reihe von Vorprozessoren, Export- und Übersetzungsprogrammen für viele Datenquellen schreiben. Die Verwendung von NodeJS war hier ein Kinderspiel.

Wenn Sie nicht viel rechnergebundene Verarbeitung, einfache Manipulation von kurzen Zeichenfolgen und Ganzzahlanalyse durchführen, ist dies wahrscheinlich nicht das beste Tool (obwohl es aufrufbare Wrapper und Module gibt) das kann gut funktionieren).

Hinweis: Halten Sie sich an Module, die Streams verwenden. Dies kann es einfacher machen, Ihre Verarbeitung für diesen bestimmten Schritt an Module weiterzuleiten. Wenn Sie sich beispielsweise ansehen, wie Event-Stream in gulp-jade für das gulp-Build-Tool verwendet wird , können Sie sehen, wie leistungsfähig es ist.

Für CSV können Sie Node- CSV verwenden , was ziemlich gut ist, um eine Basis für das Weiterleiten von Datensätzen an einen Prozessor-Stream zu erstellen.

Bei umfangreichem XML, bei dem Sie jeweils nur einen Datensatz erstellen möchten, würde ich mir node-halfstreamxml ansehen, das Ihren XML-Stream mit einem SAX-Prozessor liest und Ereignisse für jeden Knoten auslöst . Ich würde das in einen Lese- / Schreib-Stream einwickeln, damit Sie Ihre gewünschten Übereinstimmungen erhöhen können. Viele XML-Objekt-Parser im Knoten versuchen, die gesamte XML auf einmal zu lesen / zu analysieren, und beispielsweise 100 MB XML, die sehr groß werden ... wobei die Halfstream-XML als Stream gelesen wird.

ANMERKUNG: Es gibt andere Prozessoren wie xml-stream, die Expat (C-Bibliothek) darunter verwenden, die mehr Leistung bieten können, aber ohne Build-Umgebung weniger portabel sind.

Im Allgemeinen war es eine echte Freude, ...

Tracker1
quelle