2016-02-25 21 views
5

在羣集環境中,我有一個種子節點和node1和node2。Akka.net:訪問羣集中的遠程參與者

從節點1我想發送一條消息給在node2上創建的Actor。節點2上此節點的本地路徑是akka:MyAkkaSystem/user/AnActor。

現在我想用這樣的ActorSelection從一個演員從節點1發送消息到這個特定的演員:

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

在node2演員一直想創建:

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

不幸的是,由於嘗試以死信結束,因此這不起作用。

Node2上HOCON配置看起來像這樣:

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

由於我使用的燈塔種子節點。從連接的角度來看,一切似乎都行得通。種子已經找到並且每個節點都收到歡迎消息。

我以爲我在羣集上擁有位置透明性,並且可以像遠程資源那樣訪問本地。

回答

5

我以爲我在一個集羣上有位置透明性,可以到達遠程資源,就好像他們在本地一樣。

這並不容易。考慮以下情況:如果您已在同一路徑下的兩個節點上創建actor,該怎麼辦?如果您嘗試使用相對路徑 - 不顯示您想要的節點 - 哪個演員應該收到該消息?

使用基本羣集功能,您可以使用Context.ActorSelection(_cluster.ReadView.Members.Single(m => /* which node you want to choose */).Address + "/user/ConsoleReceiver");輕鬆選擇節點。羣集擴展爲您提供了一個讀取視圖數據,其中包含有關當前節點可見的所有成員的信

有很多方法可以將消息發送給其他角色,而無需知道它在哪個節點上生存。

第一種方法是使用Akka.Cluster.Toolscluster singleton功能 - 它允許您最多創建集羣中存在的actor的一個實例。如果節點發生故障,它將遷移到另一個節點。請注意,如果您想讓許多參與者以這種方式工作,則不應使用此解決方案。對於不同的特殊情況角色更是如此。

第二種方法是使用Akka.Cluster.ToolsDistributed Pub/Sub功能在訂閱特定主題的集羣中的主角之間廣播集羣範圍的事件,而不用擔心其實際位置。這是消息廣播場景的不錯選擇。

最後一種方法是使用Akka.Cluster.Sharding功能,它可以自動管理角色生命週期 - 您不需要明確創建角色 - 它還能夠從羣集中的任何位置將消息路由到它們,並可以在需要時跨多個羣集節點重新平衡它們。

+0

非常感謝。但是,我認爲節點由於羣集閒話而相互連接。所以如果節點連接,爲什麼我不能直接解決它們? –

+0

你是直接指什麼?在第一段中我描述了直接訪問節點上的actor。 – Horusiath

+0

好吧,看起來好像你必須通過查詢集羣,單例,分片,pub/sub等(這是很棒的功能)來遠程演員。但是因爲節點已經連接起來了,所以說沒有更簡單的方法:ActorSelection([節點的角色]/[到actor的路徑])或者使用客戶端的一些漂亮的HOCON魔術變得透明。 –