![](/img/trans.png)
[英]akka- how to ensure all responses of dynamic number of actors are returned to parent actor?
[英]AKKA- how to block the creation of an actor if its name is not uniqe in the cluster
我試圖阻止在系統中擁有共享相同名稱的actor的可能性(它們位於不同的路徑上,因此不會拋出InvalidActorNameException
)
application.conf:
someactor {
akka.remote.netty.tcp.port = 6405
akka.cluster.auto-down-unreachable-after = 20s
akka.cluster.seed-nodes = ["akka.tcp://mySys@127.0.0.1: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
它們將無法安全)。
如果您確實需要100%不重疊的UUID,為什么不在創建演員之前為UUID分配創建單個服務並獲取您的UUID?
您還可以在主機名,端口和actor名稱上使用SHA哈希,並為每個actor使用遞增的工作程序編號。
您還可以為工作人員設置群集路由器,akka將為您完成所有這些操作,您只需發送一個ActorRef即可訪問工作池。
我設法使用類型為群集的群集感知路由器(每個actor將在遠程節點上運行)來執行此操作。 節點的作用是名稱“someActor”,我正在使用相同名稱“someActor”初始化遠程節點上的actor(因此我將知道此actor的路徑)和路由器totalInstances配置等於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://mySys@127.0.0.1:2552"]
cluster.roles.1 = "someActor"
actor.provider = "akka.cluster.ClusterActorRefProvider"
}
現在,如果我將運行兩次RemoteActor,運行初始化路由器的應用程序並向路由器發送廣播消息 - 只有一個演員RemoterActor將接收它(並且始終是相同的)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.