2013-08-25 92 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