Welche Designentscheidungen würden Scalas Schauspieler anstelle von JMS bevorzugen?

81

Was sind die Unterschiede bei der Verwendung von Scala Actors anstelle von JMS?

Was fügt das Scala Actor-Modell beispielsweise im Hinblick auf Leistung und Skalierbarkeit im Vergleich zu JMS hinzu? In welchen Fällen ist es sinnvoller, Schauspieler anstelle von JMS zu verwenden, dh welche Probleme lösen Schauspieler, die JMS nicht abdecken kann?

Kristian
quelle

Antworten:

112

JMS- und Scala-Schauspieler teilen eine theoretische Ähnlichkeit, denken jedoch nicht, dass sie notwendigerweise dieselben Probleme architektonisch lösen. Akteure sollen eine leichte Alternative zur Parallelität mit gemeinsamem Speicher sein, bei der es im Allgemeinen schwieriger ist, versehentlich Rennen und Deadlocks zu erstellen. JMS ist eine hochentwickelte API, die Direct Messaging, Publish / Subscribe, Transaktionen, EJB-Integration usw. umfasst.

Das nächstgelegene JMS, das einem Akteur am nächsten kommt, ist eine nachrichtengesteuerte Bean, die von einer nicht persistenten, nicht transaktionalen, nicht pub / sub-Warteschlange unterstützt wird. Ich werde das eine "einfache JMS-Bean" nennen.

Nun zu Ihren Fragen.

Leistung ist schwer zu besprechen, da JMS eher eine Spezifikation als eine Implementierung ist. Nichtsdestotrotz würde ich bei Verwendung einer einfachen JMS-Bean erwarten, dass die Leistung in etwa ähnlich ist und dem Schauspieler in Bezug auf Zeit und Speicher möglicherweise einen gewissen Vorteil verschafft. Wenn Sie JMS Funktionen wie Pub / Sub, Transaktionen usw. hinzufügen, wird die Leistung natürlich noch weiter beeinträchtigt, aber dann versuchen Sie, Äpfel mit Orangen zu vergleichen.

In Bezug auf die Skalierbarkeit sollten einfache JMS-Beans ziemlich genau so skaliert werden wie Akteure. Das Hinzufügen von Transaktionen zum JMS-Mix beeinträchtigt natürlich die Skalierbarkeit um einen Betrag, der vom Umfang der Transaktionen abhängt.

Die umfassendere Frage, was Schauspieler tun, kann JMS nicht. Nun, ohne eingebautes Pub-Sub oder Transaktionen scheinen die Schauspieler von JMS abzuziehen - und im Großen und Ganzen stimmt das. Aber hier ist die Sache: Schauspieler benötigen so wenig Code, dass ich sie gerne für sehr feinkörnige Parallelität verwenden kann. In gewöhnlichem Java-Code könnte ich sagen: "Ich habe keine Lust, mit JMS und seinen Abhängigkeiten oder dem dafür benötigten Code usw. zu schrauben, also werde ich einfach einen Thread erzeugen, eine Sperre verwenden und eine Datenstruktur gemeinsam nutzen." Bei Scala-Schauspielern sage ich viel eher: "Ich werde einfach einen Schauspieler auspeitschen und weitermachen."

Es gibt auch einen philosophischen Unterschied im Design. Akteure haben ein einfaches, integriertes Konzept von Supervisor-Hierarchien. Schauspieler werden normalerweise in einem "Let it Crash" -Design verwendet. Wenn ein Schauspieler aus irgendeinem Grund stirbt, ist ein anderer Schauspieler dafür verantwortlich, zu entscheiden, was dagegen zu tun ist, z. B. diesen Schauspieler neu zu starten, eine Reihe von Schauspielern zu töten und alle neu zu starten oder eine Reihe von Schauspielern und sich selbst zu töten, damit ein anderer Schauspieler dies kann komm mit dem Problem klar. So etwas kann an JMS angehängt werden, aber es ist kein Kern der API und muss irgendwie extern verwaltet werden.

Übrigens, für eine Scala-Schauspielerbibliothek, die sich mehr in die Bereiche bewegt, die JMS abdeckt, siehe Akka . Akka bringt auch einen deklarativen Ansatz für viele gängige Strategien der Akteurshierarchie.

James Iry
quelle
Ich glaube, ich habe das abgedeckt. Ich habe die letzten Absätze aktualisiert, um dies zu verdeutlichen, und ich habe auch ein wenig über die Hierarchien der Akteure erklärt.
James Iry
2
Kristian, nicht genau. Akka-Schauspieler sind im Allgemeinen leichter als Scala-Schauspieler. Ihre API- und Konfigurationseinstellungen sind jedoch etwas komplizierter. Ich verwende Scala-Schauspieler, wenn Latenz / Durchsatz kein Problem sind (zum Beispiel für das Laichen von Arbeiteraufgaben), und Akka-Schauspieler, wenn sie es sind oder wenn ich Aufsicht benötige.
Alexander Temerev
8
Ich denke, es ist auch erwähnenswert, dass für eine JMS-Implementierung im Allgemeinen ein externer Broker erforderlich ist, bei dem Akka / Actors ohne einen externen Broker ausgeführt werden können. Wenn Sie Interprozess- / Host-Messaging wünschen, wählen Sie dies natürlich entsprechend aus.
Jasonk