2012-05-10 33 views
6

在隨播放框架提供的Websocket聊天示例中,在我看來,只有一個演員是創建/使用的;另外它使用「接收」,如果我理解的很好,強制一個演員和一個線程之間的1:1映射,有效地使這個聊天服務器單線程?玩Websocket樣本 - 只有一個Akka演員?

檢查代碼在這裏:https://github.com/playframework/Play20/blob/master/samples/scala/websocket-chat/app/models/ChatRoom.scala

如果這個分析是正確的?如果是的話,你有沒有關於如何使這個服務器可高度擴展的指針?

回答

8

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。使服務器「高度可擴展」可能會涉及大量的基準測試和一些硬件。

5

雖然websocket連接將有一個演員池,但ChatRoom Actor仍然是唯一一個正在進行消息實際處理的(單個演員實例),管理連接/斷開連接並充當插槽的路由器,這可能是瓶頸對於這種設計,消息總是按順序處理演員。我懷疑這個示例是否適用於可伸縮性,而不是用於websockets的簡單演示。