2015-03-18 8 views
6

Sto giocando con l'utilizzo di akka.Net per sviluppare un'architettura di plugin in cui ogni dll che contiene uno o più plugin viene caricata nel proprio AppDomain e un nuovo sistema di attore è pronto per ricevere i messaggi da "Host".Ho bisogno di comunicare con più sistemi di attori remoti

Mi scuoto cercando di farlo funzionare con più plug-in.

Quindi la configurazione Host si presenta come:

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 
     } 
    } 
} 

E la configurazione plug-in si presenta come:

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 
    } 
} 

(ci sono molti di questi)

La mia domanda è come ottengo messaggi dall'host a tutti i plugin?

+1

Fare in modo che si registrino all'Host all'avvio e dall'host che ora hanno la loro lista? –

risposta

10

Il miglior consiglio è usare Akka.Cluster. Ecco un esempio ben documentato: https://github.com/petabridge/akkadotnet-code-samples/tree/master/Cluster.WebCrawler

Modifica - suggerimento rimosso per utilizzare la porta dinamica. Molto meglio usare quelli statici in modo che i riavvii del nodo possano essere gestiti correttamente.

Fare in modo che ogni configurazione di plugin utilizzi una porta specifica del plug-in (akka.remote.helios.tcp.port = 1231) e quindi definire un router in cluster che comunichi con i sistemi di attori che soddisfano specifici ruoli.

/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 
    } 
} 

Questo router, schierato nel percorso user/api/broadcaster su qualche nodo può comunicare (tramite la strategia Broadcast routing) con qualsiasi attore schierato nel percorso user/api su ogni nodo del cluster con il ruolo crawler senza bisogno di cercare gli indirizzi IP , porte o qualsiasi altra schifezza.

È configurare le informazioni di clustering di un nodo tramite la seguente sezione in config di Akka.NET:

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

nodi Seed - deve essere un noto, porta staticamente definite e l'indirizzo IP. Leggi l'articolo per una spiegazione sul perché questo è importante.

Ruoli - stringhe delimitate da virgole che definiscono le funzionalità di questo particolare nodo. Sono più come tag. Puoi usarli all'interno di router in cluster (come quello che ho mostrato prima) per articolare i tipi di nodi con cui vuoi comunicare.

+0

In che modo è possibile aggirare i problemi del firewall con le porte dinamiche? – Chris

+0

@Chris si, il mio consiglio sull'uso delle porte dinamiche qui dovrebbe essere ammendato. Non si adattano bene ad Akka.Cluster a causa di una serie di problemi, essendo il firewall uno di questi. – Aaronontheweb