2016-02-25 15 views
5

In einer Clusterumgebung habe ich einen Seed-Knoten und node1 und node2.Akka.net: Zugriff auf entfernte Akteure in Cluster

Von Knoten1 Ich möchte eine Nachricht an einen Akteur senden, der auf Knoten2 erstellt wurde. Der lokale Pfad zu diesem Knoten auf Knoten2 ist akka: MyAkkaSystem/user/AnActor.

Jetzt möchte ich unter Verwendung eines ActorSelection so eine Nachricht von einem Schauspieler von node1 zu diesem speziellen Schauspieler senden:

var actorSystem = ActorSystem.Create("MyTestSystem"); 
var c = actorSystem.ActorSelection("/user/ConsoleReceiver"); 
c.Tell("Hello World"); 

Auf dem Schauspieler clusternode2 hat so geschaffen:

var actorSystem = ActorSystem.Create("MyTestSystem"); 
      var r = actorSystem.ActorOf(Props.Create<MessageReceiver>(), "ConsoleReceiver"); 
      Console.WriteLine(r.Path); 
      Console.ReadLine(); 
      actorSystem.Terminate().Wait(); 

Leider klappt das nicht, da der Versuch in toten Buchstaben endet.

Die HOCON Konfiguration auf Knoten2 sieht wie folgt aus:

akka { 
    actor { 
     provider = "Akka.Cluster.ClusterActorRefProvider, Akka.Cluster"     
     deployment {     
     }    
    } 

    remote { 
     log-remote-lifecycle-events = DEBUG 
     log-received-messages = on 

     helios.tcp { 
     transport-class = "Akka.Remote.Transport.Helios.HeliosTcpTransport, Akka.Remote" 
      applied-adapters = [] 
      transport-protocol = tcp  
     hostname = "127.0.0.1" 
     port = 0 
     } 
    }    

    cluster { 
     #will inject this node as a self-seed node at run-time 
     seed-nodes = ["akka.tcp://[email protected]:4053"] #manually populate other seed nodes here, i.e. "akka.tcp://[email protected]:4053", "akka.tcp://[email protected]:4044" 
     roles = [crawler] 
    } 
    } 

Als Samen Knoten I Leuchtturm verwende. Vom Standpunkt der Verbindung scheint alles zu funktionieren. Der Seed wurde gefunden und jeder erhaltene Knoten hat eine Willkommensnachricht erhalten.

Ich dachte, ich hätte Standorttransparenz auf einem Cluster und könnte Remote-Ressourcen erreichen, als wären sie lokal.

Antwort

5

Ich dachte, ich hätte Standorttransparenz auf einem Cluster und könnte entfernte Ressourcen erreichen, als wären sie lokal.

Dies ist nicht so einfach. Stellen Sie sich das folgende Szenario vor: Was, wenn Sie einen Akteur auf beiden Knoten unter demselben Pfad erstellt haben. Wenn Sie versuchen, den relativen Pfad zu verwenden - ohne zu zeigen, an welchen Knoten Sie denken - welcher der Akteure sollte die Nachricht erhalten?.

Mit den grundlegenden Cluster-Funktionen können Sie problemlos Knoten mit Context.ActorSelection(_cluster.ReadView.Members.Single(m => /* which node you want to choose */).Address + "/user/ConsoleReceiver"); auswählen. Die Clustererweiterung bietet Ihnen Leseansichtsdaten mit Informationen zu allen Mitgliedern, die vom aktuellen Knoten aus sichtbar sind.

Es gibt viele Möglichkeiten, Nachrichten an einen anderen Akteur zu senden, ohne wissen zu müssen, auf welchem ​​Knoten er sich befindet.

Der erste Ansatz besteht darin, Akka.Cluster.Toolscluster singleton Feature zu verwenden - es ermöglicht Ihnen, höchstens eine Instanz eines im Cluster vorhandenen Aktors zu erstellen. Im Falle von Knotenfehlern wird es zu einem anderen Knoten migrieren. Beachten Sie, dass diese Lösung nicht verwendet werden sollte, wenn Sie viele Akteure auf diese Weise arbeiten lassen möchten. Es ist mehr für unterschiedliche, spezielle Falldarsteller. Der zweite Ansatz besteht darin, die Funktion Akka.Cluster.ToolsDistributed Pub/Sub zu verwenden, um clusterweite Ereignisse über die Akteure im Cluster hinweg zu senden, die für ein bestimmtes Thema abonniert sind, ohne sich über ihren tatsächlichen Standort Gedanken machen zu müssen. Dies ist eine gute Wahl für Nachrichtensendungsszenarien. Der letzte Ansatz besteht darin, die Funktion Akka.Cluster.Sharding zu verwenden, die den Lebenszyklus der Akteure automatisch verwaltet - Sie müssen keine Akteure explizit erstellen - sie können Nachrichten auch von überall im Cluster an diese weiterleiten und bei Bedarf über viele Clusterknoten neu verteilen .

+0

Gut danke. Allerdings dachte ich, dass die Knoten aufgrund von Cluster-Klatsch miteinander verbunden waren. Also, wenn die Knoten verbunden sind, warum kann ich sie nicht direkt ansprechen? –

+0

Was meinst du mit direkt? Im ersten Abschnitt habe ich den direkten Zugriff auf den Akteur auf einem Knoten beschrieben. – Horusiath

+0

Nun, es schien, als müssten Sie einen weiten Weg zurücklegen, um zu entfernten Schauspielern zu gelangen, indem Sie Cluster, Singleton, Sharding, Pub/Sub usw. abfragen (was großartige Eigenschaften sind). Aber da die Knoten bereits verbunden sind, gibt es keinen einfacheren Weg, indem man sagt: ActorSelection ([Rolle des Knotens]/[Pfad zum Akteur]) oder es mit einiger raffinierter HOCON-Magie auf der Client-Seite transparent machen? –