假设我写了一个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能否在这些情况下保证安全?
我很想详细解释这个
答案 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