我最近開始研究Akka 2.0框架,並且能夠獲得一些代碼運行,產生執行簡單的Oracle數據庫調用的演員,執行簡單的計算以及什麼都沒有,但是在生產中沒有任何東西。如何確定在akka中產生的演員人數?
我想知道的是,有一個一般的經驗法則或最佳實踐來確定有多少演員爲特定類型的任務產卵?舉個例子,我有一個200個jdbc連接的連接池,我是否創建一個actor來表示每個連接?我是否創建了一小部分並使用循環法?
謝謝。
我最近開始研究Akka 2.0框架,並且能夠獲得一些代碼運行,產生執行簡單的Oracle數據庫調用的演員,執行簡單的計算以及什麼都沒有,但是在生產中沒有任何東西。如何確定在akka中產生的演員人數?
我想知道的是,有一個一般的經驗法則或最佳實踐來確定有多少演員爲特定類型的任務產卵?舉個例子,我有一個200個jdbc連接的連接池,我是否創建一個actor來表示每個連接?我是否創建了一小部分並使用循環法?
謝謝。
請注意,numberOf(actors)!= numberOf(線程)。
您應該爲每個實體創建一個actor,否則這些實體會跨線程共享可變狀態。演員模型的全部內容是它將分離可變狀態,以便在演員之間只有不可變的消息被交換。結果就是你不再需要任何鎖,並且你可以很容易地推斷出你的程序的線程安全性,因爲所有可變狀態都在actor中被隔離,並且你可以依靠框架在需要時正確地通過內存障礙,例如。從一個線程切換到另一個線程時。
線程數是一個不同的主題:這取決於每個線程的內核數量和阻塞係數,即等待其他線程或I/O子系統花費的時間百分比。例如,如果您的演員正在進行CPU密集型計算(例如計算Pi),那麼阻塞係數將接近0%。但是如果你的演員主要是做I/O的話,你可以很容易地假設90%或更多的阻塞係數。
最後,線程的數量可以被計算如下:
int threads = Runtime.getRuntime().availableProcessors() * 100/(100 - blockingCoefficient)
其中blockingCoefficient代表0和99包含性之間的整數百分比。
您可以創建儘可能多的演員,但是,每個家長只有約20億演員,也不要忘記在演員完成時阻止演員。此外,不要將您的演員創建爲頂級演員,除非他們實際上是頂級演員。 (即,使用context.actorOf而不是system.actorOf在演員內部創建演員)
我喜歡「每個家長約20億*限制」部分。 :) –
你可以說我是一個「樹擁抱者」 –
在Akka演員中完成阻塞操作的整個問題有點混亂:是不是應該爲這種阻塞操作產生專用線程,堵?或者是否也可以接受依靠阿卡線程管理呢? –