2017-01-03 26 views
1

我試圖阻止其在共享相同名稱的系統角色的可能性潮頭(它們是在不同的路徑,以便InvalidActorNameException不會被拋出)AKKA-如何阻止一個演員的創造,如果它的名字是不是羣集

application.conf:

someactor { 
    akka.remote.netty.tcp.port = 6405 
    akka.cluster.auto-down-unreachable-after = 20s 
    akka.cluster.seed-nodes = ["akka.tcp://[email protected]:2552"] 
    akka.actor.provider = "akka.cluster.ClusterActorRefProvider" 
} 

主營:

object SomeActor extends App { 
    val system = ActorSystem("mySys", ConfigFactory.load("application").getConfig("someactor")) 
    val t = system.actorOf(Props(classOf[SomeActor]), "someActor") 
} 

演員:

class SomeActor extends Actor { 
    val cluster = Cluster(SomeActor.system) 
    override def receive = { 
     case x=> println(x) 
    } 
} 

如果您使用6405端口運行應用程序一次,然後使用6406端口運行一次,那麼應用程序將工作,但我希望它注意到系統已經包含名爲「someActor」的actor並阻止該調用。

我不介意將名稱作爲角色或其他配置,如果它能夠通過阻止,但我不能有像包含現有名稱的地圖的狀態(或包含一個演員帶有消息傳遞的地圖)或者進行長時間運行的操作,如actorSelection(並且在任何情況下,如果actorOf是從多個地方並行調用的,它們將不安全)。

+2

聽起來像一個容易出現競爭條件的方法。如果兩個演員都是在不同節點上的相同時間點創建的呢?那麼,也許首先解釋一下你想達到的目標? (你是否像ClusterSingleton之類的東西?ClusterSingleton包含一個類似的檢查,其中單身人士必須住在最早的節點上,這已經被羣集中的所有節點認同。) – jrudolph

+1

我認爲你真正想要的是羣集分片和/或羣集單身人士。 – Ryan

+0

糾正我,如果我錯了,但不是集羣單身人士阻止按他們的類型創建演員?如果是的話,它不會爲我工作,因爲我想創建許多類'SomeActor'的演員我只是不想讓這些演員具有相同的名稱(這個名字是我的程序中每個工作人員的唯一標識符演員,所以我不能有重複) –

回答

0

我設法使用類型組的羣集感知路由器(每個角色將運行在遠程節點上)。 節點的角色是名稱「someActor」,我正在初始化具有相同名稱「someActor」的遠程節點上的actor(所以我將知道這個actor的路徑),並且路由器totalInstances config等於1 (所以只有一個節點將是路由器的一部分)

路由器INIT:

context.actorOf(
     ClusterRouterGroup(RoundRobinGroup(Nil), ClusterRouterGroupSettings(
      totalInstances = 1, routeesPaths = List("/user/someActor"), 
      allowLocalRoutees = false, useRole = Some("someActor"))).props() 

遠程演員:

object RemoteActor extends App{ 
    val system = ActorSystem("mySys",ConfigFactory.load("remoteActorConfig")) 
    system.actorOf(Props[RemoteActor], "someActor") 

} 

class RemoteActor extends Actor with ActorLogging{ 
    override def receive: Receive = { 
    case x => 
     log.info(s"got: $x}") 
    } 
} 

和remoteActorConfig:

akka{ 
    remote.netty.tcp.port = 0 
    cluster.auto-down-unreachable-after = 20s 
    cluster.seed-nodes = ["akka.tcp://[email protected]:2552"] 
    cluster.roles.1 = "someActor" 
    actor.provider = "akka.cluster.ClusterActorRefProvider" 
} 

現在,如果我要跑兩次RemoteActor,運行初始化路由器的應用程序,併發送廣播消息的路由器 - 只有一個演員RemoterActor會接受它(和始終不變的一個)。

0

如果你真的需要100%無重疊的UUID你爲什麼不只是創建UUID分配一個單獨的服務,讓你的UUID創建演員之前?

你也可以使用的主機名,端口和演員名字SHA哈希和每個演員遞增的職工人數。

你也可以建立一個集羣路由器的工人和阿卡將盡一切爲你和你只需要發送給一個ActorRef訪問工作池。

+0

uniqe標識已經存在於系統中,所以我不能創建自己的 –

相關問題