Wie unterscheidet sich das Evented-System von Node.j vom Schauspieler-Muster von Akka?

93

Ich habe Node.jseine 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.

cbmeeks
quelle
12
Ich habe dich gewählt, um all diesen engen Wählern "Geh weg" zu sagen :)
Nerrve
@cbmeeks darf ich fragen, was hast du gewählt und wie läuft es für dich mit deiner Wahl?
Jas

Antworten:

64

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.

Roland Kuhn
quelle
1
Denken Sie, dass es der beste Weg ist, PLAY-FRAMEWORK oder SPRAY zu verwenden, wenn ich AKKA zum Erstellen einer erholsamen Webanwendung verwende?
Ses
3
Ja, beide sind eine gute Wahl. Play eignet sich als Framework, das Ihnen eine vollständig integrierte Entwicklungserfahrung bietet. Dies bedeutet jedoch, dass Play Ihre Anwendung ausführt. Spray ist besser, wenn Sie nur eine dünne REST-Schicht in Ihre Akka-Anwendung einbetten möchten. Bitte beachten Sie, dass Spray in den nächsten Monaten akka-http wird.
Roland Kuhn
2
Und um darauf hinzuweisen, erhalten Sie mit Scala / Java die ganze Güte einer statisch typisierten Sprache und keine Rückruf-Hölle in Javascript. Java / Scala wäre einfacher zu debuggen als Javascript.
Chirdeep Tomar
2
In Bezug auf die Parallelität mit dem Knoten sollte erwähnt werden, dass Sie Prozesse zur Laufzeit mit seiner Cluster- Kern-API verzweigen können. Es wird das tun, was Sie unter parallelen Akteuren verstehen.
Kernel
2
Es scheint mir, dass diese Antwort aus dem Jahr 2012 sehr veraltet ist, da sich seitdem viele Dinge geändert haben, insbesondere bei Node. Schauen Sie sich die Web-Worker von npmjs.com/package/webworker-threads in Node an. Sie können blockierende intensive Arbeit in einen Parrellel-Prozess verschieben (während Sie sich im selben Node-Prozess befinden).
Mark Pieszak - Trilon.io
8

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.

Yetihehe
quelle
OK, vorausgesetzt, ich muss Protokolldateien aus vielen verschiedenen Quellen aufzeichnen. Jedes Mal, wenn eine Anwendung einen Protokolleintrag generiert, muss ich diesen Eintrag auch zur Aufzeichnung an eine andere Anwendung senden. Ich gehe davon aus, dass dies ein langwieriger Prozess sein kann, da die App DB-Zeitüberschreitungen, HTTP-Fehler usw. aufweisen kann. In diesem Beispiel würde ein schriftliches Anhalten an die DB dazu führen, dass mein gesamtes Node-System hängen bleibt. Würde AKKA das gleiche Problem haben oder bekomme ich einfach nicht die Korrelation?
cbmeeks
1
Beides würde nicht leiden, da der Datenbankzugriff in solchen Fällen normalerweise asynchron implementiert wird. Aber wenn Sie es irgendwie geschafft hätten, eine synchrone Bibliothek zu erstellen, würden beide einfrieren.
Yetihehe
Vielen Dank. Ich bemühe mich sehr, dies nicht in eine node vs akkaDebatte 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.
cbmeeks
Wenn Sie nach massiven Protokollen suchen müssen, schauen Sie sich logstash oder graylog2 an.
Toddius Zho
6

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:

  • Das Akteurmodell basiert auf Nachrichten
  • Akteursmodelle eignen sich gut für verteilte Systeme (Cluster). Sicher, ereignisbasierte Systeme können verteilt werden, aber ich denke, das Akteurmodell verfügt über eine integrierte Verteilung in Bezug auf die Verteilung von Berechnungen. Eine neue Anforderung kann an einen neuen Akteur in einem anderen Silo weitergeleitet werden. Sie sind sich nicht sicher, wie dies bei einem Ereignis funktionieren würde.
  • Das Actor-Modell unterstützt Fehler darin, dass der Beobachter im Allgemeinen ein anderes Silo finden kann, um die Arbeit zu erledigen, wenn die Cluster-1-Apperas ausgefallen sind

Schauen Sie sich auch das Drama an . Es ist eine weitere Implementierung des NodeJS-Actor-Modells.

Stevebot
quelle
1
Versuchen Sie, einen Cluster mit NodeJS einzurichten. Sie benötigen Docker, Kubernetees und erstellen das verteilte System. Versuchen Sie auch, die Verwendung von 1 weiteren Kern in nodejs einzurichten. Akka, es ist beabsichtigt, sich mit diesen zu befassen. Auch die Reife von NodeJS selbst, die Sicherheit und die Art und Weise des Codes, für die ein anderes Framework erforderlich ist, sind ein Punkt, an dem NodeJS selbst nicht für große verteilte Systeme verwendet werden können, sondern zumindest nur in Form von MSA. Meine Meinung trotzdem.
Raffaello