Scala 路由器中的状态管理

Scala 路由器中的状态管理,scala,akka,actor,Scala,Akka,Actor,假设我写了一个阿克卡演员 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))) } }

假设我写了一个阿克卡演员

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能保证安全吗


我想详细解释一下这个

首先,它与
路由器
无关。路由器只将消息分发给每个参与者,10个参与者中的每个参与者都有其唯一的可变映射。把它想象成演员禁闭

假设向一个参与者发送多条消息。那么答案取决于您的实现——简言之:
receive
中的代码。在Akka,一次只有一个参与者可以处理
接收
。因此,即使一个参与者有10条消息等待运行,每条消息一次只接收一条,然后执行
receive
。所以在一个循环中,剩下的9条消息会发生这种情况

因此,假设您的
receive
实现是完全同步的。然后操作是原子的(以及内存可见性,akka保证这一点),因此
状态
是线程安全的

但请说明它是否是异步的,即与future或(actor?msg)与pipeTo或某物,或执行某物的线程,后者将添加到
状态
。在这种情况下,您需要同步
状态
(在我看来,使用akka的全部座右铭都丢失了)。这是因为多个线程可能正在访问
状态


结束回答,这取决于您对
接收的实现

首先,它与
路由器
无关。路由器只将消息分发给每个参与者,10个参与者中的每个参与者都有其唯一的可变映射。把它想象成演员禁闭

假设向一个参与者发送多条消息。那么答案取决于您的实现——简言之:
receive
中的代码。在Akka,一次只有一个参与者可以处理
接收
。因此,即使一个参与者有10条消息等待运行,每条消息一次只接收一条,然后执行
receive
。所以在一个循环中,剩下的9条消息会发生这种情况

因此,假设您的
receive
实现是完全同步的。然后操作是原子的(以及内存可见性,akka保证这一点),因此
状态
是线程安全的

但请说明它是否是异步的,即与future或(actor?msg)与pipeTo或某物
,或执行某物的线程,后者将添加到
状态
。在这种情况下,您需要同步
状态
(在我看来,使用akka的全部座右铭都丢失了)。这是因为多个线程可能正在访问
状态


结束回答,这取决于您执行的
receive

我看到有10个actor实例,所以在循环路由器中,应该没有状态维护吗?我说得对吗here@winash对不起,我不明白。有10个actor实例,每个actor都有自己的映射。对不起,我的错误。我现在明白了,我看到有10个actor实例,所以在循环路由器中,应该没有状态维护吗?我说得对吗here@winash对不起,我不明白。有10个actor实例,每个actor都有自己的映射。对不起,我的错误。我现在明白了