在隨播放框架提供的Websocket聊天示例中,在我看來,只有一個演員是創建/使用的;另外它使用「接收」,如果我理解的很好,強制一個演員和一個線程之間的1:1映射,有效地使這個聊天服務器單線程?玩Websocket樣本 - 只有一個Akka演員?
如果這個分析是正確的?如果是的話,你有沒有關於如何使這個服務器可高度擴展的指針?
在隨播放框架提供的Websocket聊天示例中,在我看來,只有一個演員是創建/使用的;另外它使用「接收」,如果我理解的很好,強制一個演員和一個線程之間的1:1映射,有效地使這個聊天服務器單線程?玩Websocket樣本 - 只有一個Akka演員?
如果這個分析是正確的?如果是的話,你有沒有關於如何使這個服務器可高度擴展的指針?
在http://www.playframework.org/documentation/2.0.1/AkkaCore上有關於在該示例中使用的websockets的默認分派器配置的一些細節。
每個WebSocket連接狀態由Agent actor管理。爲每個WebSocket創建一個新的actor,並在套接字關閉時被殺死。
該網頁還顯示默認配置:
websockets-dispatcher = {
fork-join-executor {
parallelism-factor = 1.0
parallelism-max = 24
}
}
默認情況下,所有的調度員將在一個線程池運行他們的集演員。因此,對於每個創建websocket的客戶端,都會創建一個actor。分配多少個線程取決於使用哪個執行器服務。看起來fork-join-executor
將創建線索直至parallelism-max
。
除此之外,還有角色來處理操作和承諾。
阿卡似乎有很多旋鈕來微調性能。請參閱http://doc.akka.io/docs/akka/2.0.1/general/configuration.html。使服務器「高度可擴展」可能會涉及大量的基準測試和一些硬件。
雖然websocket連接將有一個演員池,但ChatRoom Actor仍然是唯一一個正在進行消息實際處理的(單個演員實例),管理連接/斷開連接並充當插槽的路由器,這可能是瓶頸對於這種設計,消息總是按順序處理演員。我懷疑這個示例是否適用於可伸縮性,而不是用於websockets的簡單演示。