Frage Wie unterscheiden sich die verschiedenen Actor-Implementierungen in Scala?


Mit der Veröffentlichung von Scala 2.9.0 wurde auch der Typesafe Stack angekündigt, der die Sprache Scala mit dem Akka-Framework kombiniert. Jetzt, obwohl Scala Akteure in seiner Standardbibliothek hat, verwendet Akka seine eigene Implementierung. Und wenn wir nach anderen Implementierungen suchen, werden wir feststellen, dass Lift und Scalaz auch Implementierungen haben!

Also, was ist der Unterschied zwischen diesen Implementierungen?


76
2018-05-13 19:47


Ursprung


Antworten:


Diese Antwort ist nicht wirklich meine. Es wurde produziert von Viktor Klang (von Akka Ruhm) mit der Hilfe von David Pollak (von Lift Ruhm), Jason Zaugg (von Scalaz Ruhm), Philipp Haller (von Scala Actors Ruhm).

Alles, was ich hier mache, ist das Formatieren (was einfacher wäre, wenn Stack Overflow Tabellen unterstützt).

Es gibt ein paar Orte, die ich später füllen werde, wenn ich mehr Zeit habe.

Design-Philosophie

  • Scalaz Schauspieler

    Minimale Komplexität. Maximale Allgemeingültigkeit, Modularität und Erweiterbarkeit.

  • Aufzug Schauspieler

    Minimale Komplexität, Garbage Collection von JVM, anstatt sich um einen expliziten Lebenszyklus zu kümmern, Fehlerbehandlung im Einklang mit anderen Scala & Java Programmen, geringer Speicherbedarf, Mailbox, statisch ähnlich wie Scala Actors und Erlang Actors, hohe Performance.

  • Scala Schauspieler

    Stellen Sie das vollständige Erlang-Actor-Modell in Scala mit geringem / geringem Speicherbedarf bereit.

  • Akka Schauspieler

    Einfach und transparent verteilbar, leistungsstark, leicht und sehr anpassungsfähig.

Versionierung

                    Scalaz Schauspieler Aufzug Schauspieler Scala Schauspieler Akka Schauspieler
Aktuell stabil ver. 5 2.1 2.9.0 0.10
Minimale Scala. 2.8 2.7.7 2.8
Minimum Java ver. 1.5 1.5 1.6

Schauspieler Modell Unterstützung

                    Scalaz Schauspieler Aufzug Schauspieler Scala Schauspieler Akka Schauspieler
Neue Schauspieler spawnen Ja Ja Ja Ja
innerhalb des Schauspielers
Nachrichten an Ja senden Ja Ja Ja
bekannter Schauspieler
Verhalten ändern Akteure sind Ja Ja: geschachtelt Ja:
für die nächste Nachricht unveränderlich reagieren / erhalten werden / nicht erhalten
Aufsicht Nicht vorgesehen Nein Schauspieler: Ja, Ja
(link / trapExit) Reaktor: Nein

Level der Statusisolation

Wenn der Benutzer öffentliche Methoden definiert ihre Schauspieler, sind sie abrufbar die Außenseite?

  • Scalaz Schauspieler: kA. Schauspieler ist eine versiegelte Eigenschaft.
  • Lift Actors: Ja
  • Scala Schauspieler: Ja
  • Akka Actors: Nein, Akteurin ist hinter einem ActorRef abgeschirmt.

Aktentyp

  • Scalaz Schauspieler: Actor[A] extends A => ()
  • Lift Actors: LiftActor, SpecializeLiftActor[T]
  • Scala Schauspieler: Reactor[T], Actor extends Reactor[Any]
  • Akka Schauspieler: Actor[Any]

Actor Lifecycle Management

                    Scalaz Schauspieler Aufzug Schauspieler Scala Schauspieler Akka Schauspieler
Manueller Start Nein Nein Ja Ja
Manueller Stopp Nein Nein Nein Ja
Restart-on-failure nicht zutreffend Ja Ja Konfigurierbar pro Actor-Instanz
Restart-Semantik nicht zutreffend. Akteur erneut ausführen Akteur in einen stabilen Zustand zurückversetzen, indem er neu zugewiesen wird und
                                                    Verhalten die alte Instanz wegwerfen
Konfigurierbarkeit neu starten n / a n / a X-mal, X-mal Y-mal
Lifecycle-Hooks werden bereitgestellt. Kein Lifecycle-Vorgang vor Start, nach dem Start, vor dem Neustart, nach dem Start

Nachrichten senden Modi

                    Scalaz Schauspieler Aufzug Schauspieler Scala Schauspieler Akka Schauspieler
Feuer-vergessen a! Nachrichtenschauspieler! msg Schauspieler! msg actorRef! msg
                    eine Nachricht)
Senden-Empfangen-Antworten (siehe 1) Schauspieler!? msg schauspieler! msg schauspielerRef !! msg
                                    Darsteller !! msg
Senden-Empfangen-Zukunft (siehe 2) Schauspieler !! msg actorRef !!! msg
Sende-Ergebnis-Versprechen (Nachricht). future.onComplete (f => zu! f.result)
Zukunft (Schauspieler)
Verfassen Sie Schauspieler mit Schauspieler comap f Nein Nein Nein
Funktion (siehe 3)

(1) Jede Funktion f wird so ein Schauspieler:

val a: Msg => Promise[Rep] = f.promise
val reply: Rep = a(msg).get

(2) Jede Funktion f wird so ein Schauspieler:

val a = f.promise
val replyFuture = a(message)

(3) kontravarianter Funktor: actor comap f. Auch Kleisli Komposition in Promise.

Nachrichtenantwortmodi

TBD

                    Scalaz Schauspieler Aufzug Schauspieler Scala Schauspieler Akka Schauspieler
Antwort an Absender in Nachricht
Antwort auf Nachricht

Nachrichtenverarbeitung

Unterstützt geschachtelte empfangen?

  • Scalaz Schauspieler: -
  • Lift Actors: Ja (mit einer kleinen Handcodierung).
  • Scala Actors: Ja, sowohl threadbasiert als auch ereignisbasiert reagieren.
  • Akka Actors: Nein, das Empfangen von Schachtelungen kann im Laufe der Zeit zu Speicherlecks und zu Leistungseinbußen führen.

Mechanismus zur Nachrichtenausführung

TBD

                    Scalaz Schauspieler Aufzug Schauspieler Scala Schauspieler Akka Schauspieler
Name für Ausführungsmechanismus
Ausführungsmechanismus ist
konfigurierbar
Ausführungsmechanismus kann sein
spezifiziert für jeden Akteur
Lebenszyklus des Ausführungsmechanismus
muss explizit verwaltet werden
Thread-pro-Actor-Ausführung
Mechanismus
Ereignisgesteuerter Ausführungsmechanismus
Postfachtyp
Unterstützt vorübergehende Postfächer
Unterstützt persistente Postfächer

Verteilung / Remote-Akteure

                    Scalaz Schauspieler Aufzug Schauspieler Scala Schauspieler Akka Schauspieler
Transparente Fernbedienung n / a Nein Ja Ja
Schauspieler
Transportprotokoll nicht zutreffend Java Avka Remote Protocol
                                                    Serialisierung (Protobuf über TCP)
                                                    auf TCP
Dynamisches Clustering n / a n / a n / a Im kommerziellen Angebot

Howtos

TBD

                    Scalaz Schauspieler Aufzug Schauspieler Scala Schauspieler Akka Schauspieler
Definieren Sie einen Akteur
Erstellen Sie eine Actor-Instanz
Starten Sie eine Actor-Instanz
Stoppen Sie eine Akteursinstanz

95
2018-05-13 20:53



  • scala.actors war der erste ernsthafte Versuch, die Erlang-ähnliche Gleichzeitigkeit in Scala zu implementieren, die andere Bibliotheksdesigner dazu inspiriert hat, bessere (in einigen Fällen) und leistungsfähigere Implementierungen zu machen. Das größte Problem (zumindest für mich) ist, dass im Gegensatz zu Erlang-Prozessen, ergänzt mit OTP (das ermöglicht das Erstellen von fehlertoleranten Systemen), scala.actors bieten nur eine gute Grundlage, eine Reihe von stabilen Primitiven, die für den Aufbau eines höherrangigen Frameworks verwendet werden müssen - am Ende des Tages müssen Sie Ihre eigenen Supervisoren, Akteurskataloge, endliche Automaten, etc schreiben über Schauspielern.

  • Und hier Akka kommt zur Rettung und bietet einen voll ausgestatteten Stack für die akteursbasierte Entwicklung: mehr idiomatische Akteure, hochrangige Abstraktionen für die Koordination (Load Balancer, Actor Pools, etc.) und den Aufbau von fehlertoleranten Systemen (Supervisor, portiert von OTPusw.), leicht konfigurierbare Disponenten (Dispatcher) und so weiter. Tut mir leid, wenn ich unhöflich bin, aber ich denke, es wird keine Zusammenführung geben 2.9.0+ - Ich würde es eher erwarten Akka Akteure, die stdlib-Implementierung schrittweise zu ersetzen.

  • Scalaz. Normalerweise habe ich diese Bibliothek in der Liste der Abhängigkeiten aller meiner Projekte, und wenn ich aus irgendeinem Grund nicht verwenden kann Akka, nicht blockierend Scalaz verspricht (mit all der Güte, wie sequence) in Kombination mit den Standardakteuren sparen den Tag. Ich habe es nie benutzt Scalaz Schauspieler als Ersatz für scala.actors oder Akka, jedoch.


23
2018-05-13 21:13



Schauspieler: Scala 2.10 gegen Akka 2.3 gegen Aufzug 2.6 gegen Scalaz 7.1

Testcode & Ergebnisse für durchschnittliche Latenz und Durchsatz auf JVM 1.8.0_x.


2
2018-04-02 10:24