在 akka 中,使用一个(而且只有一个)不是 child 的演员的正确模式是什么?
In akka, what's correct pattern to use one (and only one) actor that's not a child?
我有 2 个演员:
class ActorA extends Actor {
def receive = ???
}
object ActorA {
val actorA = system.actorOf(Props[ActorA])
}
class ActorB extends Actor {
def receive = {
case aMessage => ActorA.actorA ! aMessage
}
}
我希望 actorA 在任何时候都只有一个实例(以施加一种背压)
但是对于上面的代码,如果 ActorA actor 中有错误,actor 将重新启动并且 ActorRef actorA 不再正确。
在这种情况下正确使用的模式是什么?我必须使用 ActorSelection 吗?
是的。 .actorOf()
创建 一个演员
假设您的两个 actor 在 init 中创建一次 Class/Object/Main
val actorA = system.actorOf(Props[ActorA])
val actorB = system.actorOf(Props[ActorB])
从 context
恢复对现有 ActorA
的引用
class ActorB extends Actor {
val aA = context.actorSelection( "/user/ActorA" )
def receive = {
case aMessage => aA ! aMessage
}
}
备选方案是
- 传递 ActorA
ActorPath
或其对 ActorB 构造函数的引用
- 将 ActorA 创建为 ActorB 的子级(如果这对您的情况有意义)
基本上,您似乎想要分布式系统中的单例。
首先,我想强调的是,如果您不能很好地处理分区,这会给您带来麻烦。其次,如果您只在 1 个节点上,那不是问题。最后,这是作为 Akka 的内置 cluster-singleton 实现的,所以你可以看看它。
我有 2 个演员:
class ActorA extends Actor {
def receive = ???
}
object ActorA {
val actorA = system.actorOf(Props[ActorA])
}
class ActorB extends Actor {
def receive = {
case aMessage => ActorA.actorA ! aMessage
}
}
我希望 actorA 在任何时候都只有一个实例(以施加一种背压)
但是对于上面的代码,如果 ActorA actor 中有错误,actor 将重新启动并且 ActorRef actorA 不再正确。
在这种情况下正确使用的模式是什么?我必须使用 ActorSelection 吗?
是的。 .actorOf()
创建 一个演员
假设您的两个 actor 在 init 中创建一次 Class/Object/Main
val actorA = system.actorOf(Props[ActorA])
val actorB = system.actorOf(Props[ActorB])
从 context
ActorA
的引用
class ActorB extends Actor {
val aA = context.actorSelection( "/user/ActorA" )
def receive = {
case aMessage => aA ! aMessage
}
}
备选方案是
- 传递 ActorA
ActorPath
或其对 ActorB 构造函数的引用 - 将 ActorA 创建为 ActorB 的子级(如果这对您的情况有意义)
基本上,您似乎想要分布式系统中的单例。 首先,我想强调的是,如果您不能很好地处理分区,这会给您带来麻烦。其次,如果您只在 1 个节点上,那不是问题。最后,这是作为 Akka 的内置 cluster-singleton 实现的,所以你可以看看它。