1

假设我将一个 akka 演员写成

class SomeActor extends Actor {
  val state =  mutable.Map[String, Long]()

  def receive = { // Do some processing on the state
  }

  override def postStop () { 
      println(Integer.toHexString(System.identityHashCode(state)))
  }
}

如果我使用循环路由器,现在进行负载平衡

actorSystem.actorOf(Props(classOf[SomeActor]).withRouter(RoundRobinRouter(nrOfInstances=10)))

在这种情况下,akka 如何管理状态?在这种情况下,akka 能保证安全吗?

我希望对此有详细的解释

4

1 回答 1

4

首先,它与router. 路由器仅将消息分发给每个单独的参与者,并且 10 的每个参与者都有其唯一的可变映射。把它想象成演员的禁锢。

假设多条消息被发送给一个actor。那么答案取决于您的实现 - 简而言之:您的receive. 在 Akka 中,一次只有一个 actor 可以处理receive. 因此,即使一个 actor 有 10 条消息等待运行,每条消息也会一次获取一条receive并被执行。因此,在一个循环中,剩余的 9 条消息会发生这种情况。

所以说如果你的receive实现是纯粹同步的。然后操作是原子的(连同内存可见性,akka 保证这一点),因此state是线程安全的。

但是说如果它是异步with future or (actor ? msg) with pipeTo or something的,或者是一个线程执行稍后添加的东西state。在这种情况下,您需要同步state(IMO,使用 akka 的整个座右铭都丢失了)。这是因为多个线程可能正在访问state.

结束答案,这取决于您的实施receive

于 2013-08-25T11:25:54.453 回答