2015-03-18 3 views
6

Ich spiele mit akka.Net, um eine Plugin-Architektur zu entwickeln, wobei jede DLL, die ein oder mehrere Plugins enthält, in ihr eigenes AppDomain geladen wird und ein neues Akteurs-System initialisiert wird, um Nachrichten zu empfangen vom "Gastgeber".Ich muss mit mehreren Remote-Actor-Systeme kommunizieren

Ich werde nicht mehr versuchen, dies mit mehreren Plugins zu arbeiten.

So ist die Host-Konfiguration wie folgt aussieht:

akka { 
    actor { 
     provider = ""Akka.Remote.RemoteActorRefProvider, Akka.Remote"" 
    } 
    remote { 
     helios.tcp { 
      transport-class = ""Akka.Remote.Transport.Helios.HeliosTcpTransport, Akka.Remote"" 
      applied-adapters = [] 
      transport-protocol = tcp 
      port = 50003 
      hostname = localhost 
     } 
    } 
} 

Und das Plugin Config wie folgt aussieht:

akka { 
    actor { 
     provider = ""Akka.Remote.RemoteActorRefProvider, Akka.Remote"" 
    } 
    remote { 
     helios.tcp { 
      transport-class = ""Akka.Remote.Transport.Helios.HeliosTcpTransport, Akka.Remote"" 
      applied-adapters = [] 
      transport-protocol = tcp 
      port = 50004 
      hostname = localhost 
    } 
} 

(viele davon sind)

Meine Frage ist, wie bekomme ich Nachrichten vom Host an alle Plugins?

+1

Haben sie sich beim Start beim Host angemeldet, und vom Host haben Sie jetzt ihre Liste? –

Antwort

10

Die beste Empfehlung ist die Verwendung von Akka.Cluster. Hier ist ein gut dokumentiertes Beispiel: https://github.com/petabridge/akkadotnet-code-samples/tree/master/Cluster.WebCrawler

Bearbeiten - Vorschlag entfernt, um dynamischen Port zu verwenden. Es ist viel besser, statische zu verwenden, damit Knoten-Neustarts korrekt gehandhabt werden können.

Lassen Sie jede Plugin-Konfiguration einen pluginspezifischen Port verwenden (akka.remote.helios.tcp.port = 1231) und definieren Sie dann einen Cluster-Router, der mit Aktorsystemen kommuniziert, die bestimmte Rollen erfüllen.

/api/broadcaster { 
    router = broadcast-group 
    routees.paths = ["user/api"] 
    cluster { 
     enabled = on 
     max-nr-of-instances-per-node = 1 
     allow-local-routees = on 
     use-role = crawler 
    } 
} 

Dieser Router kann crawler IP an Pfad user/api auf jedem Knoten im Cluster mit Rolle eingesetzt kommunizieren (über die Broadcast Routing-Strategie) mit jedem Akteure auf dem Weg user/api/broadcaster auf einen Knoten implementiert Adressen nachschlagen, ohne dass , Ports oder irgendwas von diesem Mist.

Sie konfigurieren eine Gruppierungsinformation des Knotens über den folgenden Abschnitt in Akka.NET config:

cluster { 
    #manually populate other seed nodes here, i.e. "akka.tcp://[email protected]:4053" 
    seed-nodes = ["akka.tcp://[email protected]:4053"] 
    roles = [crawler] 
} 

Seed Knoten - hat eine bekannte, statisch definierten Port und IP-Adresse. Lesen Sie den Artikel für eine Erklärung, warum dies wichtig ist.

Rollen - durch Kommas getrennte Strings, die definieren, welche Funktionen diese bestimmten Knoten haben. Sie sind eher wie Tags. Sie können sie innerhalb von Cluster-Routern (wie dem, den ich zuvor gezeigt habe) verwenden, um zu artikulieren, mit welchen Arten von Knoten Sie kommunizieren wollen.

+0

Wie können Sie Firewall-Probleme mit dynamischen Ports umgehen? – Chris

+0

@Chris ja, mein Tipp zur Verwendung dynamischer Ports sollte hier verbessert werden. Sie passen nicht gut zu Akka.Cluster wegen einer Vielzahl von Problemen, Firewall ist einer von ihnen. – Aaronontheweb

Verwandte Themen