AKKA-如果演员的名字在集群中不是唯一的,如何阻止演员的创建

AKKA- how to block the creation of an actor if its name is not uniqe in the cluster

我试图阻止系统中的参与者共享相同名称的可能性(他们在不同的路径上,因此 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 端口,那么应用程序将运行,但我希望它注意到系统已经包含一个名为 [=28= 的参与者] 并阻止该调用。

我不介意将名称添加为角色或其他配置,如果它能够阻止它,但我不能有一个状态,比如包含已经存在的名称的地图(或包含带有消息传递的映射)或者像 actorSelection 这样的长 运行ning 操作(无论如何,如果从多个地方并行调用 actorOf,它们将不安全)。

如果您真的需要 100% 不重叠的 UUID,为什么不创建一个用于 UUID 分配的服务并在创建 actor 之前获取您的 UUID?

您还可以在主机名、端口和参与者名称上使用 SHA 哈希,并为每个参与者使用递增的工作人员编号。

您还可以为工作人员设置一个集群路由器,而 akka 会为您完成所有这些工作,您只需发送到一个 ActorRef 即可访问工作人员池。

我设法使用组类型的集群感知路由器来做到这一点(每个参与者将 运行 在远程节点上)。 节点的角色是名称 "someActor" ,我在远程节点上用相同的名称 "someActor" 初始化演员(所以我会知道这个演员的路径)和路由器 totalInstances 配置等于 1(因此只有一个节点将成为路由器的一部分)

路由器初始化:

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 会收到它(并且始终相同一个).