Ich habe eine unbekannte Anzahl von Jobs, die von einer bekannten (natürlich) Anzahl von Schauspielern ausgeführt werden müssen. Die anfängliche Auftragsnummer kann sich erhöhen, nachdem ein Akteur einen Auftrag abgeschlossen hat. Das heißt, ein Akteur fügt nach Abschluss seiner Aufgabe möglicherweise einen neuen auszuführenden Job hinzu.
Die Art und Weise, wie ich damit umgehe, ist, dass jeder Akteur eine Nachricht zurück an den Master sendet, wenn er seinen Auftrag beendet, nicht nur mit dem Ergebnis der Ausführung, sondern auch mit einem "Flag", das anzeigt, dass der Akteur jetzt inaktiv ist. Der Master hat eine Warteschlange von Jobs und eine Schlange von untätigen Akteuren. Immer wenn ein Akteur eine "Job abgeschlossen" Nachricht sendet, prüft der Master, ob es noch etwas anderes für diesen Akteur zu tun gibt ... und so weiter bis zur Warteschlange der Jobs ist leer und die Leerlauf-Warteschlange ist voll ... an diesem Punkt habe ich das System heruntergefahren. Es gibt hier nicht viel Aufsicht, also fühle ich, dass ich es nicht richtig mache ...
Ich benutze keinen Router, weil ich keine Möglichkeit gefunden habe, den Router nach Idle Actors abzufragen, also lautet meine Frage:
Was ist der "richtige" Weg, um mit der Situation umzugehen, die ich oben in Akka beschrieben habe?
Sie sollten sich die Routing-Funktionen von Akka ansehen. SmallestMailboxRouter
könnte sein was du suchst.
Als Alternative könnten Sie einfach Akteure auf Anforderung erstellen, d. h. für jede Aufgabe wird dynamisch ein neuer Akteur erstellt. Ein zentraler Akteur verfolgt alle aktuell aktiven Akteure. Sobald ein Arbeiter-Akteur fertig ist, sendet er sich selbst ein PoisonPill
und informiert den Master über sein Herunterfahren (aktiv oder über die Standard-Nachricht Terminate
, die Akka an den betreuenden Schauspieler sendet). Sobald keine aktiven Akteure mehr vorhanden sind, d. H. Keine Aufgaben mehr, schaltet der Controler-Akteur das System ab.
Ergänzung nach dem Lesen des Kommentars:
Sehen Sie sich die Quellen von SmallestMailboxLike
an, eine Scala-Eigenschaft, die von SmallestMailboxRouter
gemischt wird. Achtung: Sie sollten Grundkenntnisse in Scala haben. Aber das ist generell eine gute Idee, wenn Sie Akka verwenden wollen ... Die Methode isProcessingMessage(ActorRef)
kann als isNotIdle(ActorRef)
Eine andere Strategie kann darin bestehen, einen BalancingDispatcher und einen RoundRobinRouter (als "Actor" -Pool) zu verwenden. Aus Akka-Dokumenten:
%Vor%Definieren Sie Ihren Dispatcher in der application.conf oder laden Sie ihn beim Start programmatisch.
%Vor%Definieren Sie dann den Router und den Dispatcher für die Routen.
%Vor%Der Router wird einfach weiter Nachrichten "verteilen", und der Dispatcher wird einen ausgewählten Akteur ausführen (und implementiert auch Arbeitsstehlen)
Der ausgleichende Dispatcher verwendet nur ein Postfach für alle erstellten Akteure, die alle mit BalancingDispatcher erstellt wurden. So wird es Ihre Arbeit einfach machen.