2017-06-20 2 views
0

Wie kann ich eine Nachricht an alle Schauspieler senden, die einen bestimmten Schauspieler sehen?Broadcast-Nachricht an Schauspieler, die einen bestimmten Schauspieler sehen?

Für den Kontext angenommen, ich habe eine AuctionActor (die möglicherweise ein Remote-Actor ist), die von einer großen Anzahl von AuctionParticipantActor Typen beobachtet wird. Ich möchte die AuctionActor verschiedene Nachrichten an AuctionParicipantActor Arten senden.

Eine Möglichkeit wäre für die AuctionActor, eine Sammlung aller Teilnehmer ActorRef Instanzen zu halten und dann diese Sammlung zu durchlaufen, wenn jemals eine Nachricht an alle Teilnehmer gesendet werden muss. Dies scheint ineffizient und ich für eine bessere Lösung bin der Hoffnung, ...

+1

Distributed PubSub mit dem Thema der Name des Schauspielers zu sein scheint, eine bessere Lösung als hier –

+0

beobachten Sie Ihre 'AuctionParticipantActor's sieht nur eine' AuctionActor' oder mehrere? – thwiegan

+0

@thwiegan Im Allgemeinen würde jeder "AuctionParticipantActor" mehrere "AuctionActor" -Instanzen überwachen wollen. – davidrpugh

Antwort

0

Wenn Sie von Diego Martinoia wie erwähnt nicht mit PubSub gehen wollen, würde ich mit Routers mit BroadcastingLogic vorschlagen. Dies geht in die Richtung, die Sie mit der Sammlung von ActorRefs erwähnt haben, verwendet jedoch die Akka-Funktionalität, um effizienter zu sein, als nur über eine Sammlung in Ihrem AuctionActor zu iterieren.

Von Akka Docs

Router sind so konzipiert, extrem effizient sein bei Empfang von Nachrichten und Leiten sie schnell auf routees.

Ein normaler Akteur kann für das Routing von Nachrichten verwendet werden, aber die Singlethread-Verarbeitung eines Actors kann zu einem Engpass werden. Router können einen viel höheren Durchsatz mit einer Optimierung der üblichen Nachrichtenverarbeitungspipeline erzielen, die gleichzeitiges Routing ermöglicht.

In Ihrem Fall könnte es so aussehen:

class AuctionActor extends Actor { 
    var router = Router(BroadcastRoutingLogic(), Vector[ActorRefRoutee]()) 

    def receive = { 
    case AddParticipant(ref) => 
     router = router.addRoutee(ref) 
    case RemoveParticipant(ref) => 
     router = router.removeRoutee(ref) 
    case update: ImportantUpdate => 
     router.route(update, self) 
    } 
} 
+0

Spielt es eine Rolle, ob der 'ActorRef' ein lokaler Schauspieler oder ein entfernter Schauspieler ist? Ich denke nicht ... – davidrpugh

+0

Das ist eine gute Frage. Ich würde erwarten, dass es ortstransparent ist, aber ich denke, es sollte nicht schwer sein, es zu testen. Du kannst es versuchen, ich werde es auch tun, wenn ich dazu komme. Wäre super, wenn Sie ein Update geben können. Hier scheint es Informationen zu Remote-Routern zu geben: http://doc.akka.io/docs/akka/current/scala/routing.html#remote-deployed-routees Aber das sieht so aus, als würde es verwendet, um die Routen auf entfernten Systemen zu erstellen , wo wie in Ihrem Fall die Routen bereits existieren. – thwiegan

+0

@davidrpugh Getestet, funktioniert mit Remote-Routen ohne Änderungen am Code. – thwiegan

Verwandte Themen