Zunächst einmal sind die "älteren" Nachrichtensysteme (MQ) in der Implementierung älter, aber sie sind eine neuere technische Idee von: persistenten Transaktionswarteschlangen . Scala Actors und Akka sind möglicherweise eine neuere Implementierung, basieren jedoch auf einem älteren Parallelitätsmodell von Actors.
Die beiden Modelle sind sich jedoch in der Praxis sehr ähnlich, da beide auf Ereignismeldungen basieren: Siehe meine Antwort auf RabbitMQ vs Akka .
Wenn Sie nur für die JVM codieren möchten, ist Akka wahrscheinlich eine gute Wahl. Ansonsten würde ich RabbitMQ verwenden.
Auch wenn Sie ein Scala-Entwickler sind, sollte Akka ein Kinderspiel sein. Akkas Java-Bindungen sind jedoch nicht sehr Java-artig und erfordern aufgrund des Scala-Typsystems ein Casting.
Auch in Java werden normalerweise keine unveränderlichen Objekte erstellt, die ich für Messaging empfehle. Infolgedessen ist es in Java sehr einfach, versehentlich etwas mit Akka zu tun, das nicht skaliert werden kann (unter Verwendung veränderlicher Objekte für Nachrichten, basierend auf dem seltsamen Rückrufstatus beim Schließen). Mit MQ ist dies kein Problem, da die Nachrichten immer auf Kosten der Geschwindigkeit serialisiert werden. Bei Akka sind sie im Allgemeinen nicht.
Akka skaliert auch bei einer großen Anzahl von Verbrauchern besser als die meisten MQ. Dies liegt daran, dass für die meisten MQ-Clients (JMS, AMQP) jede Warteschlangenverbindung einen Thread erfordert ... daher viele Warteschlangen == viele permanent laufende Threads. Dies ist jedoch hauptsächlich ein Kundenproblem. Ich denke, ActiveMQ Apollo hat einen nicht blockierenden Dispatcher, der angeblich dieses Problem für AMQP behebt. Der RabbitMQ-Client verfügt über Kanäle, mit denen Sie mehrere Verbraucher kombinieren können. Es gibt jedoch immer noch Probleme mit einer großen Anzahl von Verbrauchern, die möglicherweise zum Ausfall von Deadlocks oder Verbindungen führen. Daher werden im Allgemeinen mehr Threads hinzugefügt, um dieses Problem zu vermeiden.
That being said Akka des Remoting ziemlich neu ist und wahrscheinlich nicht bieten noch nicht alle zuverlässigen Nachrichten Garantien und QoS , dass die traditionellen Nachrichtenwarteschlangen liefern (aber die jeden Tag ändert). Es ist im Allgemeinen auch Peer-to-Peer, aber ich denke, es unterstützt Server-to-Peer, was im Allgemeinen das ist, was die meisten MQ-Systeme tun (dh Single Point of Failure), aber es gibt MQ-Systeme, die Peer-to-Peer sind (RabbitMQ ist Server-). to-peer).
Schließlich machen RabbitMQ und Akka tatsächlich ein gutes Paar. Sie können Akka als Wrapper für RabbitMQ verwenden, insbesondere da RabbitMQ Ihnen nicht dabei hilft, den Verbrauch von Nachrichten zu handhaben und die Nachrichten lokal (in einer einzelnen JVM) weiterzuleiten.
Wann sollte man Akka wählen?
- Haben Sie viele Verbraucher (denken Sie Millionen).
- Benötigen Sie eine geringe Latenz
- Öffnen Sie das Actor-Parallelitätsmodell
Beispielsystem: Ein interaktives Echtzeit-Chat-System
Wann wählen Sie MQ
- Notwendigkeit der Integration in viele verschiedene Systeme (dh Nicht-JVM)
- Die Zuverlässigkeit von Nachrichten ist wichtiger als die Latenz
- Möchte mehr Tools und Admin-Benutzeroberfläche
- Wegen vorheriger Punkte besser für lange laufende Aufgaben
- Möchte ein anderes Parallelitätsmodell als Actors verwenden
Beispielsystem: Ein geplantes Transaktions-Stapelverarbeitungssystem
BEARBEITEN basierend auf betroffenen Kommentaren
Ich ging davon aus, dass sich das OP mit der verteilten Verarbeitung befasst, die sowohl von Akka als auch von Message Queues verarbeitet werden kann. Das heißt, ich nahm an, er sprach über verteilte Akka . Die Verwendung von Akka für die lokale Parallelität ist ein Vergleich zwischen Äpfeln und Orange im Vergleich zu den meisten Nachrichtenwarteschlangen . Ich sage das meiste, weil Sie das Nachrichtenwarteschlangenmodell lokal als Parallelitätsmodell (dh Thema, Warteschlangen, Austausch) anwenden können, das sowohl in der Reactor- Bibliothek als auch einfach reagiert tun.
Die Auswahl des richtigen Parallelitätsmodells / der richtigen Parallelitätsbibliothek ist für Anwendungen mit geringer Latenz sehr wichtig. Eine verteilte Verarbeitungslösung wie eine Nachrichtenwarteschlange ist im Allgemeinen nicht ideal, da das Routing fast immer über das Kabel erfolgt, was offensichtlich langsamer als innerhalb der Anwendung ist und daher Akka eine überlegene Wahl wäre. Ich glaube jedoch, dass einige proprietäre MQ-Technologien lokales Routing ermöglichen. Wie ich bereits erwähnt habe, sind die meisten MQ-Clients ziemlich dumm in Bezug auf Threading und verlassen sich nicht auf nicht blockierende E / A und haben einen Thread pro Verbindung / Warteschlange / Kanal ... ironischerweise ist nicht blockierendes Io nicht immer eine niedrige Latenz, sondern im Allgemeinen mehr Ressource effizient.
Wie Sie sehen, ist das Thema verteilte Programmierung und gleichzeitige Programmierung ziemlich umfangreich und ändert sich täglich. Daher war meine ursprüngliche Absicht nicht verwirrend, sondern konzentrierte sich auf einen bestimmten Bereich der verteilten Nachrichtenverarbeitung, mit dem ich mich im OP befasst habe. In Bezug auf die Parallelität könnte man seine Suche auf "reaktive" Programmierung (RFP / Streams) konzentrieren, die ein "neueres", aber ähnliches Modell wie das Akteurmodell und das Nachrichtenwarteschlangenmodell ist, von denen alle diese Modelle im Allgemeinen kombiniert werden können, weil sie sind ereignisbasiert.