1

我正在使用 WebSockets 开发一个聊天应用程序(在带有 scala 的 Play 2.3 中)。必须根据传入消息将消息广播给所有用户或特定用户组。一个用户可以参与多个群聊,并且能够同时与个人聊天。

Concurrent.broadcast[JsValue]返回元组(enumerator, channel)。我不知道如何对这个频道应用过滤器,所以只有特定的客户组会收到消息。

我们可以在枚举器上应用过滤器,例如 (enumerator &> 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 个用户)。谢谢你。

4

1 回答 1

2

是的,您可以使用演员来处理它,我什至更喜欢这样,因为您将拥有某种可变状态(特定房间中的用户列表或类似的东西)。

基本上,每个附加的 websocket 都有一个演员,然后您可以看到该演员代表一个用户并让它与其他演员交互。例如,您可以让它注册一个代表聊天室的参与者,然后让发送到该聊天室的消息发送给所有注册的参与者参与者。

每个参与者本身占用的内存很少,因此您的应用程序是否能够处理超过 1000 个用户更多地取决于您的用例的其余部分、发送的消息数量、消息的大小等。

文档中有一些带有 websockets+actors 的代码示例:http ://www.playframework.com/documentation/2.3.x/ScalaWebSockets

于 2014-07-02T15:06:23.280 回答