Akka - 路由器中的状态管理

时间:2013-08-25 11:01:01

标签: scala akka actor

假设我写了一个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)))
  }
}

现在进行负载均衡,如果我使用Round-Robin路由器

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

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

我很想详细解释这个

1 个答案:

答案 0 :(得分:4)

首先,它与router无关。路由器仅将消息分发给每个单独的actor,并且10的每个actor都有其唯一的可变映射。把它想象为演员限制。

假设有多条消息发送给演员。然后答案取决于您的实施 - 简而言之:receive中的代码。在Akka,一次只有一个演员可以处理receive。因此,即使一个actor有10个等待运行的消息,每个消息一次被取一个,并执行receive。所以在循环中它会发生剩下的9条消息。

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

但是,如果它是异步的,即with future or (actor ? msg) with pipeTo or something,或执行某些后来添加到state的线程。在这种情况下,你需要同步state(IMO,使用akka的整个座右铭都会丢失)。这是因为多个线程可能正在访问state

结束答案,这取决于您receive

的实施情况