1

我试图阻止系统中存在共享相同名称的参与者的可能性(它们位于不同的路径上,因此InvalidActorNameException不会被抛出)

应用程序.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”的参与者并阻止该调用。

我不介意将名称添加为角色或其他配置,如果它能够阻止它,但我不能拥有像包含现有名称的地图的状态(或包含带有消息传递的地图的演员) 或进行长时间运行的操作(无论如何,如果从多个地方并行调用actorSelection它们将不安全)。actorOf

4

2 回答 2

0

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

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

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

于 2017-01-03T22:17:06.863 回答
0

我设法使用组类型的集群感知路由器来做到这一点(每个参与者都将在远程节点上运行)。节点的角色是名称“someActor”,我在远程节点上用相同的名称“someActor”初始化actor(所以我会知道这个actor的路径)和路由器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,运行初始化路由器的应用程序并向路由器发送广播消息 - 只有一个 Actor RemoteActor 会收到它(并且始终是同一个)。

于 2017-01-20T14:27:39.607 回答