播放Websocket示例 - 只有一位Akka演员?

时间:2012-05-10 22:30:58

标签: scala playframework playframework-2.0 akka actor

在随播放框架提供的Websocket聊天示例中,在我看来,只创建/使用过一个actor;它还使用“接收”,如果我理解的话,强制演员和线程之间的1:1映射,有效地使这个聊天服务器单线程?

检查此处的代码:https://github.com/playframework/Play20/blob/master/samples/scala/websocket-chat/app/models/ChatRoom.scala

如果这个分析正确吗?如果是,您是否有关于如何使该服务器具有高度可扩展性的指示?

2 个答案:

答案 0 :(得分: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
  }
}

默认情况下,所有调度程序都将在线程池上运行其actor集。因此,对于创建websocket的每个客户端,将创建一个actor。分配了多少个线程取决于使用哪个执行程序服务。似乎fork-join-executor将根据需要创建线程parallelism-max

最重要的是,还有演员来处理行动和承诺。

akka似乎有许多旋钮可以微调性能。见http://doc.akka.io/docs/akka/2.0.1/general/configuration.html。制作服务器"高度可扩展"可能会涉及很多基准测试和一些硬件。

答案 1 :(得分:5)

尽管websocket连接将具有一个actor池,但仍然是ChatRoom Actor是唯一一个(单个actor实例)使用消息进行实际处理,管理连接/断开连接并像插座的路由器那样可能是其中的瓶颈这种设计因为消息总是按顺序为演员处理。我怀疑这个样本是否具有可扩展性,而是一个简单的websockets演示。