Hier ist das Muster, auf das ich gestoßen bin:
Ein Schauspieler A
hat mehrere Kinder C1
, ..., Cn
. Nach Erhalt einer Nachricht sendet A
die Nachricht an jedes ihrer untergeordneten Elemente, die jeweils eine Berechnung für die Nachricht durchführen und diese nach Abschluss an A
zurücksenden. A
möchte dann die Ergebnisse aller Kinder kombinieren, um sie an einen anderen Akteur weiterzugeben.
Wie würde eine Lösung für dieses Problem aussehen? Oder ist das ein Anti-Pattern? In welchem Fall sollte dieses Problem angegangen werden?
Hier ist ein triviales Beispiel, das hoffentlich meine aktuelle Lösung zeigt. Meine Bedenken sind, dass Duplikate Code ist (bis zur Symmetrie); erstreckt sich nicht sehr gut auf "viele" Kinder; und macht es ziemlich schwer zu sehen, was vor sich geht.
%Vor%Wenn Sie denken, dass der Code gottverdammt aussieht, nehmen Sie es mir einfach, ich habe gerade begonnen, Akka zu lernen;)
Im Fall vieler - oder einer unterschiedlichen Anzahl - von Kinderschauspielern wird das Frage-Muster von Zim-Zam vorgeschlagen wird schnell außer Kontrolle geraten.
Das Aggregator-Muster wurde entwickelt, um bei dieser Art von Situation zu helfen. Es bietet eine Aggregator-Eigenschaft, die Sie in einem Akteur verwenden können, um Ihre Aggregationslogik auszuführen.
Ein Client-Akteur, der eine Aggregation durchführen möchte, kann eine Aggregator-basierte Akteursinstanz starten und ihm eine Nachricht senden, die den Aggregationsprozess anstößt.
Für jede Aggregationsoperation sollte ein neuer Aggregator erstellt und beim Zurücksenden des Ergebnisses beendet werden (wenn alle Antworten oder ein Timeout empfangen wurden).
Ein Beispiel für dieses Muster zum Summieren von ganzzahligen Werten, die von den von der Child-Klasse dargestellten Aktoren gehalten werden, ist unten aufgeführt. (Beachten Sie, dass sie nicht alle Kinder sein müssen, die von demselben übergeordneten Akteur betreut werden: Der SummationAggregator benötigt lediglich eine Sammlung von ActorRefs.)
%Vor%Um diesen SummationAggregator von Ihrem übergeordneten Akteur zu verwenden, können Sie Folgendes tun:
%Vor%und behandeln Sie dann AggregationResult irgendwo im Empfang der Eltern.
Sie können ?
anstelle von !
für die untergeordneten Akteure verwenden. Dies führt dazu, dass die untergeordneten Akteure Future
mit ihren (eventuellen) Ergebnissen zurückgeben, dh bis Sie% co_de noch nicht blockieren % das Ergebnis von Await
. Der Hauptdarsteller kann dann diese Future
zusammenstellen und sie an einen anderen Akteur senden - er wird bereits jede Futures
Identität kennen und Sie müssen sich nicht darum kümmern, jede Nachricht zu markieren, damit Sie sie später wieder in Ordnung bringen können . Hier ist ein einfaches Beispiel, in dem jedes Kind ein zufälliges Future's
zurückgibt und Sie den Rückgabewert des ersten Kindes durch den Rückgabewert des zweiten Kindes dividieren möchten (d. H. Reihenfolge ist wichtig).
Tags und Links scala mapreduce concurrency akka