Ich habe Node.js
eine Weile mit gearbeitet und halte mich für ziemlich gut mit Java. Aber ich habe es gerade entdecktAkka
und war sofort an seinem Schauspielermuster interessiert (soweit ich weiß).
Unter der Annahme, dass meine JavaScript-Kenntnisse meinen Scala / Java-Kenntnissen entsprechen, möchte ich mich auf die Praktikabilität beider Systeme konzentrieren. Besonders in Bezug auf Webdienste.
Nach meinem Verständnis kann Node viele gleichzeitige Vorgänge hervorragend verarbeiten. Ich kann mir vorstellen, dass ein guter Node-Webdienst für ein Asset-Management-System viele Benutzer gleichzeitig verarbeiten kann, die Änderungen einreichen (in einer großen Anwendung mit hohem Datenverkehr).
Aber nachdem ich über die Schauspieler in Akka gelesen habe, scheint es, dass es sich in derselben Sache auszeichnen würde. Und ich mag die Idee, die Arbeit auf mundgerechte Stücke zu reduzieren. Außerdem habe ich mich vor Jahren in Erlang versucht und mich in das verwendete Nachrichtenübermittlungssystem verliebt.
Ich arbeite an vielen Anwendungen, die sich mit komplexer Geschäftslogik befassen, und ich denke, es ist Zeit, schwerer in die eine oder andere zu springen. Insbesondere das Upgrade älterer Struts- und C # -Anwendungen.
Wie unterscheiden sich die beiden Systeme grundlegend, um heilige Kriege zu vermeiden? Es scheint, dass beide auf dasselbe Ziel ausgerichtet sind. Vielleicht hat Akkas "selbstheilende" Architektur einen Vorteil.
BEARBEITEN
Es sieht so aus, als würde ich enge Stimmen bekommen. Bitte nehmen Sie diese Frage nicht als "Was ist besser, Knoten oder Akka?". Was ich suche, sind die grundlegenden Unterschiede in ereignisgesteuerten Bibliotheken wie Node und schauspielerbasierten Bibliotheken wie Akka.
Antworten:
Ohne auf die Details einzugehen (über die ich im Fall von Node.js zu wenig weiß), besteht der Hauptunterschied darin, dass Node.js nur Parallelität ohne Parallelität unterstützt, während Akka beide unterstützt. Beide Systeme sind vollständig ereignisgesteuert und können auf große Arbeitslasten skaliert werden. Die fehlende Parallelität macht es jedoch in Node.js schwierig (dh Parallelität wird explizit codiert, indem mehrere Knoten gestartet und Anforderungen entsprechend versendet werden. Sie ist daher zur Laufzeit unflexibel.) , während es in Akka aufgrund seiner abstimmbaren Multithread-Executoren recht einfach ist. Bei kleinen isolierten Arbeitseinheiten (Schauspieleraufrufe) parallelisiert Akka automatisch die Ausführung für Sie.
Ein weiterer wichtiger Unterschied besteht darin, dass Akka ein System zur strukturierten Behandlung von Fehlern enthält (indem jeder Akteur von seinem übergeordneten Element überwacht wird, was obligatorisch ist), während Node.js sich auf Konventionen stützt, mit denen Autoren Fehlerbedingungen von Rückruf zu Rückruf übergeben können. Das zugrunde liegende Problem besteht darin, dass asynchrone Systeme nicht den Standardansatz von Ausnahmen verwenden können, die von synchronen stapelbasierten Systemen verwendet werden, da der "aufrufende" Code zum Zeitpunkt des Rückruffehlers zu verschiedenen Aufgaben übergegangen ist. Wenn die Fehlerbehandlung in das System integriert ist, ist es wahrscheinlicher, dass auf diesem System erstellte Anwendungen robust sind.
Das Obige soll nicht erschöpfend sein, ich bin sicher, dass es noch viel mehr Unterschiede gibt.
quelle
Ich habe Akka noch nicht benutzt, aber es scheint erlang-artig zu sein, aber in Java. In erlang sind alle Prozesse wie Akteure in Akka, sie haben Postfächer, Sie können Nachrichten zwischen ihnen senden, Sie haben Vorgesetzte usw.
Node.js verwendet kooperative Parallelität. Das bedeutet, dass Sie Parallelität haben, wenn Sie dies zulassen (z. B. wenn Sie io operation oder ein asynchrones Ereignis aufrufen). Wenn Sie eine lange Operation haben (etwas in einer langen Schleife berechnen), blockieren ganze Systeme.
Erlang verwendet präventives Task-Switching. Wenn Sie eine lange Schleife haben, kann das System diese anhalten, um einen anderen Vorgang auszuführen und nach einiger Zeit fortzufahren. Für massive Parallelität ist Node.js gut, wenn Sie nur kurze Operationen ausführen. Beide unterstützen Millionen von Kunden: http://blog.caustik.com/2012/08/19/node-js-w1m-concurrent-connections/ http://blog.whatsapp.com/index.php/2012/01/ 1 Million-is-so-2011 /
In Java benötigen Sie Threads, um Parallelität zu erreichen. Andernfalls können Sie die Ausführung innerhalb der Funktion nicht anhalten, was erlang tut (tatsächlich wird erlang zwischen Funktionsaufrufen angehalten, dies geschieht jedoch mit allen Funktionen). Sie können die Ausführung zwischen Nachrichten anhalten.
quelle
node vs akka
Debatte umzuwandeln, aber ich habe ein echtes Problem, das ich lösen muss. Ich würde sagen, dass meine Java / JavaScript-Kenntnisse ziemlich nahe beieinander liegen, aber ich habe sehr wenig Erfahrung mit Node und keine mit AKKA (oder Scala). Aber ich habe mehrere Anwendungen (intern für jetzt, aber extern später) und die Leute suchen nach Möglichkeiten, diese massiven Protokolle zu durchsuchen. Aus Datenschutzgründen können keine externen Optionen von Drittanbietern verwendet werden. Scheint, dass beide den Job erledigen würden. Aber ich mag die Nachricht von AKKA, damit ich das untersuchen kann. Außerdem wird Java hier mehr als JS gepusht. Vielen Dank.Ich bin mir nicht sicher, ob dies ein fairer Vergleich ist. Ich lese dies eher als "Wie vergleicht sich ein ereignisbasiertes System mit einem Akteurmodell?". Nodejs können ein Schauspielermodell unterstützen, genau wie Scala in Akka oder C # in Orleans. Schauen Sie sich Nactor an , jemand scheint es bereits zu versuchen.
Was den Vergleich eines Ereignissystems mit einem Akteurmodell angeht, würde ich klügere Leute beschreiben lassen. Ein paar kurze Punkte zum Actor-Modell:
Schauen Sie sich auch das Drama an . Es ist eine weitere Implementierung des NodeJS-Actor-Modells.
quelle