簡體   English   中英

AKKA-如果一個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM