在 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 实现的,所以你可以看看它。