Ich habe viel über das Akka- Framework (Java / Scala-Serviceplattform) schwärmen hören , aber bisher nicht viele Beispiele für Anwendungsfälle gesehen, für die es gut wäre. Ich würde mich also interessieren, was Entwickler erfolgreich damit gemacht haben.
Nur eine Einschränkung: Bitte schließen Sie den Fall des Schreibens eines Chat-Servers nicht ein. (warum? da dies als Beispiel für viele ähnliche Dinge überstrapaziert wurde)
Antworten:
Ich habe es bisher in zwei realen Projekten sehr erfolgreich eingesetzt. Beide befinden sich im nahezu Echtzeit-Verkehrsinformationsfeld (Verkehr wie in Autos auf Autobahnen), verteilt auf mehrere Knoten, integrieren Nachrichten zwischen mehreren Parteien und sind zuverlässige Backend-Systeme. Es steht mir noch nicht frei, Angaben zu Kunden zu machen. Wenn ich das OK erhalte, kann es möglicherweise als Referenz hinzugefügt werden.
Akka hat diese Projekte wirklich durchgesetzt, obwohl wir mit Version 0.7 angefangen haben. (Wir benutzen übrigens Scala)
Einer der großen Vorteile ist die Leichtigkeit, mit der Sie ein System aus Akteuren und Nachrichten fast ohne Boilerplating zusammenstellen können. Es lässt sich ohne die Komplexität des handgerollten Threadings sehr gut skalieren und Sie erhalten fast kostenlos asynchrone Nachrichten, die zwischen Objekten übertragen werden.
Es ist sehr gut bei der Modellierung jeder Art von asynchroner Nachrichtenverarbeitung. Ich würde es vorziehen, irgendeine Art von (Web-) Dienstsystem in diesem Stil zu schreiben als jeden anderen Stil. (Haben Sie jemals versucht, einen asynchronen Webdienst (serverseitig) mit JAX-WS zu schreiben? Das ist viel Aufwand.) Ich würde also sagen, dass jedes System, das nicht an einer seiner Komponenten hängen möchte, weil alles implizit mit synchronen Methoden aufgerufen wird und dass eine Komponente etwas blockiert. Es ist sehr stabil und die Let-it-Crash + Supervisor-Lösung für Fehler funktioniert wirklich gut. Alles ist einfach programmgesteuert einzurichten und nicht schwer zu testen.
Dann gibt es die hervorragenden Zusatzmodule. Das Camel-Modul lässt sich gut in Akka integrieren und ermöglicht die einfache Entwicklung von asynchronen Diensten mit konfigurierbaren Endpunkten.
Ich bin sehr zufrieden mit dem Framework und es wird zu einem Defacto-Standard für die verbundenen Systeme, die wir erstellen.
quelle
Haftungsausschluss: Ich bin der PO für Akka
Neben dem Angebot eines Parallelitäts-Smorgasbords, das viel einfacher zu überlegen und zu korrigieren ist (Akteure, Agenten, Datenfluss-Parallelität) und mit Parallelitätskontrolle in Form von STM.
Hier sind einige Anwendungsfälle, die Sie in Betracht ziehen könnten:
quelle
Ein Beispiel für die Verwendung wäre eine Prioritätswarteschlange für Debit- / Kreditkartentransaktionen. Wir haben Millionen davon und der Aufwand der Arbeit hängt vom Typ der Eingabezeichenfolge ab. Wenn die Transaktion vom Typ CHECK ist, haben wir nur sehr wenig Verarbeitung, aber wenn es sich um eine Verkaufsstelle handelt, gibt es viel zu tun, z. B. das Zusammenführen mit Metadaten (Kategorie, Label, Tags usw.) und das Bereitstellen von Diensten (E-Mail- / SMS-Benachrichtigungen, Aufdeckung von Betrug, geringes Guthaben usw.). Basierend auf dem Eingabetyp erstellen wir Klassen mit verschiedenen Merkmalen (Mixins genannt), die für die Bearbeitung des Auftrags erforderlich sind, und führen dann die Arbeit aus. Alle diese Jobs werden im Echtzeitmodus von verschiedenen Finanzinstituten in dieselbe Warteschlange gestellt. Sobald die Daten bereinigt sind, werden sie zur Persistenz, Analyse oder an eine Socket-Verbindung oder an den Lift-Kometenakteur an verschiedene Datenspeicher gesendet. Die arbeitenden Akteure gleichen die Arbeit ständig selbst aus, damit wir die Daten so schnell wie möglich verarbeiten können. Wir können auch zusätzliche Services, Persistenzmodelle undstm für kritische Entscheidungspunkte.
Die Erlang-Nachricht im OTP-Stil, die an die JVM weitergeleitet wird, ist ein großartiges System für die Entwicklung von Echtzeitsystemen auf den Schultern vorhandener Bibliotheken und Anwendungsserver.
Mit Akka können Sie Nachrichten wie bei einer herkömmlichen Nachricht weitergeben esbaber mit Geschwindigkeit! Außerdem erhalten Sie Tools im Framework, mit denen Sie die große Anzahl von Akteurpools, Remote-Knoten und Fehlertoleranz verwalten können, die Sie für Ihre Lösung benötigen.
quelle
Wir verwenden Akka, um REST-Aufrufe asynchron zu verarbeiten. Zusammen mit dem asynchronen Webserver (Netty-basiert) können wir die Anzahl der pro Knoten / Server bedienten Benutzer im Vergleich zum herkömmlichen Thread pro Benutzeranforderungsmodell um das Zehnfache verbessern.
Sagen Sie Ihrem Chef, dass Ihre AWS-Hosting-Rechnung um den Faktor 10 sinken wird und es ein Kinderspiel ist! Shh ... erzähl es aber nicht Amazon ... :)
quelle
Wir verwenden Akka in einem großen Telekommunikationsprojekt (leider kann ich nicht viele Details preisgeben). Akka-Akteure werden von einer Webanwendung remote bereitgestellt und abgerufen. Auf diese Weise haben wir ein vereinfachtes RPC-Modell, das auf Google Protobuffer basiert, und wir erreichen Parallelität mit Akka Futures. Bisher hat dieses Modell hervorragend funktioniert. Ein Hinweis: Wir verwenden die Java-API.
quelle
Wenn Sie den Chat-Server eine Ebene höher abstrahieren, erhalten Sie die Antwort.
Akka bietet ein Messaging-System, das Erlangs "Let it Crash" -Mentalität ähnelt.
Beispiele sind also Dinge, die ein unterschiedliches Maß an Haltbarkeit und Zuverlässigkeit von Nachrichten erfordern:
Das Schöne an Akka sind die Auswahlmöglichkeiten für die Persistenz, die STM-Implementierung, der REST-Server und die Fehlertoleranz.
Lassen Sie sich nicht vom Beispiel eines Chat-Servers ärgern, sondern betrachten Sie es als Beispiel für eine bestimmte Lösungsklasse.
Bei all ihrer hervorragenden Dokumentation denke ich, dass genau diese Frage, Anwendungsfälle und Beispiele eine Lücke sind. Beachten Sie, dass die Beispiele nicht trivial sind.
(Geschrieben mit nur Erfahrung im Ansehen von Videos und Spielen mit der Quelle, habe ich nichts mit akka implementiert.)
quelle
Wir verwenden Akka in mehreren Projekten bei der Arbeit, von denen das interessanteste mit der Reparatur von Fahrzeugunfällen zusammenhängt. Hauptsächlich in Großbritannien, jetzt aber auch in den USA, Asien, Australasien und Europa. Wir setzen Akteure ein, um sicherzustellen, dass Informationen zur Unfallreparatur in Echtzeit bereitgestellt werden, um die sichere und kostengünstige Reparatur von Fahrzeugen zu ermöglichen.
Die Frage bei Akka ist wirklich mehr: Was kann man mit Akka nicht machen? Die Fähigkeit zur Integration in leistungsstarke Frameworks, die leistungsstarke Abstraktion und alle Aspekte der Fehlertoleranz machen es zu einem sehr umfassenden Toolkit.
quelle
Sie können Akka für verschiedene Arten von Dingen verwenden.
Ich habe an einer Website gearbeitet, auf der ich den Technologie-Stack auf Scala und Akka migriert habe. Wir haben es für so ziemlich alles verwendet, was auf der Website passiert ist. Auch wenn Sie vielleicht denken, dass ein Chat-Beispiel schlecht ist, sind alle im Grunde gleich:
Besonders die Live-Updates sind einfach, da sie sich auf ein Chat-Beispiel beschränken. Der Serviceteil ist ein weiteres interessantes Thema, da Sie einfach Remote-Akteure verwenden können. Selbst wenn Ihre App nicht geclustert ist, können Sie sie problemlos auf verschiedenen Computern bereitstellen.
Ich verwende Akka auch für eine PCB-Autorouter-Anwendung mit der Idee, von einem Laptop zu einem Rechenzentrum skalieren zu können. Je mehr Kraft Sie geben, desto besser wird das Ergebnis sein. Dies ist äußerst schwierig zu implementieren, wenn Sie versuchen, die übliche Parallelität zu verwenden, da Akka Ihnen auch Standorttransparenz bietet.
Derzeit baue ich als Freizeitprojekt ein Web-Framework, bei dem nur Schauspieler verwendet werden. Die Vorteile sind wiederum die Skalierbarkeit von einer einzelnen Maschine auf einen gesamten Maschinencluster. Durch die Verwendung eines nachrichtengesteuerten Ansatzes ist Ihr Softwaredienst von Anfang an orientiert. Sie haben all diese netten Komponenten, die miteinander sprechen, sich aber nicht unbedingt kennen und auf demselben Computer leben, nicht einmal im selben Rechenzentrum.
Und seit Google Reader heruntergefahren ist, habe ich mit einem RSS-Reader begonnen, natürlich mit Akka. Für mich dreht sich alles um gekapselte Dienste. Fazit: Das Akteurmodell selbst sollte zuerst übernommen werden, und Akka ist ein sehr zuverlässiger Rahmen, der Ihnen bei der Implementierung hilft und viele Vorteile bietet, die Sie auf Ihrem Weg erhalten.
quelle
Wir verwenden akka mit seinem Kamel-Plugin, um unsere Analyse- und Trendverarbeitung für twimpact.com zu verteilen . Wir müssen zwischen 50 und 1000 Nachrichten pro Sekunde verarbeiten. Zusätzlich zur Mehrknotenverarbeitung mit Kamel wird es auch verwendet, um die Arbeit auf einem einzelnen Prozessor für maximale Leistung auf mehrere Arbeiter zu verteilen. Funktioniert recht gut, erfordert jedoch ein gewisses Verständnis für den Umgang mit Überlastungen.
quelle
Ich habe Akka (Java API) ausprobiert. Ich habe versucht, Akkas schauspielerbasiertes Parallelitätsmodell mit dem des einfachen Java-Parallelitätsmodells (java.util.concurrent-Klassen) zu vergleichen.
Der Anwendungsfall war eine einfache kanonische Karte, die die Implementierung der Zeichenanzahl reduzierte. Der Datensatz bestand aus einer Sammlung zufällig generierter Zeichenfolgen (400 Zeichen lang) und berechnete die Anzahl der darin enthaltenen Vokale.
Für Akka habe ich einen BalancedDispatcher (zum Lastausgleich zwischen Threads) und RoundRobinRouter (um meine Funktionsakteure einzuschränken) verwendet. Für Java habe ich eine einfache Fork-Join-Technik verwendet (implementiert ohne einen Algorithmus zum Stehlen von Arbeit), mit der die Ausführungen gegabelt / reduziert und die Ergebnisse verknüpft werden. Zwischenergebnisse wurden in Blockierungswarteschlangen gespeichert, um selbst die Verbindung so parallel wie möglich zu gestalten. Wenn ich mich nicht irre, würde das wahrscheinlich das "Mailbox" -Konzept der Akka-Schauspieler nachahmen, bei denen sie Nachrichten empfangen.
Beobachtung: Bis zu mittleren Lasten (~ 50000 String-Eingabe) waren die Ergebnisse vergleichbar und variierten geringfügig in verschiedenen Iterationen. Wenn ich jedoch meine Last auf ~ 100000 erhöhte, blieb die Java-Lösung hängen. Ich habe die Java-Lösung unter dieser Bedingung mit 20 bis 30 Threads konfiguriert und sie ist in allen Iterationen fehlgeschlagen.
Das Erhöhen der Last auf 1000000 war auch für Akka fatal. Ich kann den Code mit allen Interessierten teilen, um eine Gegenprüfung durchzuführen.
Für mich scheint Akka besser zu skalieren als herkömmliche Java-Multithread-Lösungen. Und wahrscheinlich ist der Grund die Magie von Scala unter der Haube.
Wenn ich eine Problemdomäne als ereignisgesteuerte Nachricht modellieren kann, die eine übergibt, ist Akka meiner Meinung nach eine gute Wahl für die JVM.
Test durchgeführt auf: Java Version: 1.6 IDE: Eclipse 3.7 Windows Vista 32 Bit. 3 GB RAM. Intel Core i5 Prozessor, Taktrate 2,5 GHz
Bitte beachten Sie, dass die für den Test verwendete Problemdomäne diskutiert werden kann und ich versucht habe, so fair zu sein, wie es meine Java-Kenntnisse zulassen :-)
quelle
Wir verwenden Akka in gesprochenen Dialogsystemen ( Primetalk ). Sowohl intern als auch extern. Um viele Telefoniekanäle gleichzeitig auf einem einzelnen Clusterknoten ausführen zu können, ist offensichtlich ein Multithreading-Framework erforderlich. Akka funktioniert einfach perfekt. Wir haben einen früheren Albtraum mit der Java-Parallelität. Und mit Akka ist es wie eine Schaukel - es funktioniert einfach. Robust und zuverlässig. 24 * 7, ohne Unterbrechung.
Innerhalb eines Kanals haben wir einen Echtzeitstrom von Ereignissen, die parallel verarbeitet werden. Insbesondere: - langwierige automatische Spracherkennung - erfolgt mit einem Schauspieler; - Audioausgabeproduzent, der einige Audioquellen (einschließlich synthetisierter Sprache) mischt; - Die Umwandlung von Text in Sprache ist eine separate Gruppe von Akteuren, die von den Kanälen gemeinsam genutzt werden. - Semantik und Wissensverarbeitung.
Um Verbindungen komplexer Signalverarbeitung herzustellen, verwenden wir SynapseGrid . Es hat den Vorteil, dass der DataFlow in den komplexen Akteursystemen zur Kompilierungszeit überprüft wird.
quelle
Ich habe kürzlich das kanonische Beispiel zur Kartenreduzierung in Akka implementiert : Word count. Es ist also ein Anwendungsfall von Akka: bessere Leistung. Es war mehr ein Experiment der Schauspieler von JRuby und Akka als alles andere, aber es zeigt auch, dass Akka nicht nur Scala oder Java ist: Es funktioniert in allen Sprachen zusätzlich zu JVM.
quelle