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 会收到它(并且始终相同一个).
我试图阻止系统中的参与者共享相同名称的可能性(他们在不同的路径上,因此 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 会收到它(并且始终相同一个).