2013-08-25 73 views
1

假设我写的阿卡演员作为阿卡 - 国家管理路由器

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))) 

如何在这样一个不阿卡管理状态场景?阿卡在这样的情况下保证安全吗?

我喜欢这个

回答

4

的详细解释首先,它无关router。路由器仅将消息分发给每个单独的演员,每个10的演员都拥有唯一的可变映射。把它看作是演员禁闭。

假设将多条消息发送给演员。那么答案取决于你的实现 - 简而言之:你的代码在你的receive。在阿卡,一次只有一个演员可以处理receive。因此,即使通过一个演员有10条消息等待运行,每条消息也会一次执行一条,并执行receive。所以在一个循环中发生剩余的9条消息。

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

但是说如果它是异步的,即with future or (actor ? msg) with pipeTo or something,或者执行一些后来增加到state的线程。在这种情况下,您需要同步state(国际海事组织,使用阿卡的全部座右铭已丢失)。这是因为多个线程可能正在访问state

最终的答案,它取决于你的落实receive

+0

我看到有演员的10个实例,所以在轮转路由器,也应该没有状态保持?我在这里 – winash

+1

@winash对不起,我不明白。有10个演员实例,每个演员都有自己的地图。 – Jatin

+0

对不起我的错误。我现在明白了 – winash