我正在使用WebSockets处理聊天应用程序(在Play 2.3中使用scala)。必须根据传入消息将消息广播给所有用户或特定用户组。一个用户可以参与多个群组聊天,并且可以同时与个人聊天。
Concurrent.broadcast[JsValue]
返回元组(enumerator, channel)
。我不知道如何将过滤器应用于此通道,因此只有特定的客户端组才能收到消息。
我们可以在枚举器上应用过滤器 (枚举器&> Enumeratee.filter [JsValue] {...})。但我们无法通过此枚举器推送消息。
我不想在客户端解析消息。 我的代码看起来像这样,
val (public_enumerator, public_channel) = Concurrent.broadcast[JsValue]
def chat = WebSocket.using[JsValue] { request =>
val in = Iteratee.foreach[JsValue]{ msg =>
public_channel.push(msg)
}.map { _ =>
// Quit connection
}
(in ,public_enumerator)
}
我在网上找到的大多数示例都使用了弃用的方法,其中一些在Play 2.3中被删除(如Enumerators.imperative)。我不知道Concurrent.unicast
是如何运作的。
我想知道是否有另一种使用Actors做同样的方法。我也想知道,这个设计将处理更高的负载(超过1000个用户)。谢谢。
答案 0 :(得分:2)
是的,你可以用演员来处理它,我甚至更愿意,因为你会有某种可变状态(特定房间的用户列表或类似的东西)。
基本上,每个附加的websocket都会有一个actor,你可以看到该actor代表一个用户并让它与其他actor交互。你可以让它注册一个代表聊天室的演员,然后让那个房间的消息发送给所有注册的参与者。
每个actor本身占用的内存非常少,因此您的应用程序是否能够处理超过1000个用户更多的是关于用例的其余部分,发送的消息数量,消息的大小等等。 / p>
docs中有一些带有websockets + actors的代码示例:http://www.playframework.com/documentation/2.3.x/ScalaWebSockets