-
Notifications
You must be signed in to change notification settings - Fork 2
Folge 46: Herr Potter und die Aktoren #53
Comments
Schöne Beschreibung, am Besten finde ich "Das Aktmodell geht auf Gul Abdulnabi Agha zurück" und "Akku Typed" ;-) |
Danke! Fixed! |
Hehe, da hat die macOS Autokorrektur zugeschlagen 😅 |
Aaaalso… ich bin ja auch kein Akka-Guru, aber die offenen Fragen kann ich beantworten, denke ich ;-) Ein http-Request aus mehreren Teilen beantwortenEin User wird ja folgendermaßen abgefragt: get {
val users: Future[User] = (userRegistryActor ? GetUser(name)).mapTo[User]
complete(users)
}
Nun war eure Frage, was passiert, wenn man nun eine Response aus mehren Futures erzeugt - also z.B. den Userdaten, der Frage nach dem Sinn des Lebens und sonstnochwas ;-) Der "Kunstgriff" ist, mehrere parallele Berechnungen anzustoßen (gibt je ein Future) und diese in ein einzelnes Future zusammenzufassen, welches erfüllt ist, wenn alle parallelen Berechnungen erledigt sind. Dies geht am einfachsten mit einer for-Comprehension. Der Code sieht dann folgendermaßen aus: get {
extractExecutionContext { implicit executor =>
val user: Future[User] =
(userRegistryActor ? GetUser(user)).mapTo[User]
val meaningOfLife = Future.successful(42)
val somethingElse = Future.successful("foobar")
val allComplete = for {
a <- users
b <- somethingElse
c <- meaningOfLife
} yield (a,b,c)
val result = allComplete.map { case (u,_,_) =>
u // Erzeugt die finale Darstellung. Ok, habe hier nichts gecodet, deshalb einfach nur die Userdaten…
}
complete(result)
}
}, Die Das war's auch schon :-) Beispiel für Aktoren-HierarchienIhr wart auf der Suche nach einem Beispiel, wo diese Supervision sinnvoll genutzt werden kann. Angeommen, der User Registry Actor würde die Daten tatsächlich aud einer Datenbank holen, und angenommen, es gäbe noch mehr Daten aus der Datenbank. Dann könnte ein darüberliegender Supervisor die Datenbank-Connection verwalten. Explodiert nun einer der DB-Zugriffs-Aktoren wegen Wegbrechen der Datenbank-Verbindung, so kann der darüberliegende Aktor geeignet agieren: Alle anderen Aktoren stoppen (die können ohne DB-Verbindung ja auch nicht funktionieren - da müssen sie ja nicht mühsam selbst in irgendeinen Netzwerk-Timeout o.ä. tappen) und anschießend zentral geeinet reagieren: Verbindungsversuch erst nach ein paar Sekunden, falls erfolglos nach größerer Zeitspanne, etc. Ist die Verbindung wieder da, erzeugt er die DB-Zugriffs-Aktoren neu. |
@Skyr vielen Dank für deinen ausführlichen Kommentar und sorry, dass ich mich erst jetzt melde. Habe das irgendwie übersehen! Also klar, du kannst natürlich das ask pattern nutzen um Ergebnisse zusammen führen. Aber ist das wirklich the way to go? Ich sehe hier ein paar Probleme:
Dein Beispiel zur Supervision ist nachvollziehbar aber ich Frage mich, was der Mehrwert der Supervision an dieser Stelle ist. Wie ich im Podcast gesagt habe, habe bin ich noch nie an einen Punkt gekommen, wo ich dieses Konzept vermisst habe. Was bringt es, dass die DB-Zugriffs-Aktoren gestoppt werden? Ohne Supervision kannst du keine Requests mehr bearbeiten, weil deine Datenbank nicht erreichbar ist. Mit Supervision...? Selbes Ergebnis aber dafür die zusätzliche Komplexität entsprechende Supervision zu implementieren. Ob ich in einer Java Anwendung immer wieder mit meinen Repositories gegen eine nicht erreichbare Datenbank renne und dann einen Fehler bekomme oder jemand feststellt, dass die Datenbank nicht erreichbar ist und dann einen Fehler zurück gibt, das macht für mich keinen Unterschied. Aber wahrscheinlich bin ich einfach nicht in der Aktorendenke drin und kann es deshalb nicht nachvollziehen :-) |
No description provided.
The text was updated successfully, but these errors were encountered: