1

私は WebSockets (Play 2.3 with scala) を使用してチャット アプリケーションに取り組んでいます。メッセージは、着信メッセージに基づいて、すべてのユーザーまたは特定のユーザーのセットにブロードキャストする必要があります。1 人のユーザーが複数のグループ チャットに参加し、個人と同時にチャットすることができます。

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

アクターを使用して同じことを行う別の方法があるかどうかを知りたいです。また、この設計はより高い負荷 (1000 人以上のユーザー) を処理できることも知りたいです。ありがとうございました。

4

1 に答える 1

2

はい、アクターで処理できます。ある種の可変状態 (特定の部屋にいるユーザーのリストなど) があるため、それを好むことさえあります。

基本的に、接続された WebSocket ごとに 1 つのアクターを取得し、そのアクターを 1 人のユーザーを表すものとして認識し、他のアクターと対話させることができます。たとえば、チャット ルームを表すアクターに登録させ、そのルームへのメッセージをすべての登録済み参加アクターに送信させることができます。

各アクター自体はほとんどメモリを消費しないため、アプリが 1000 人を超えるユーザーを処理できるかどうかは、残りのユース ケース、送信されるメッセージの数、メッセージの大きさなどに関係します。

ドキュメントに websockets+actors のコード サンプルがいくつかあります: http://www.playframework.com/documentation/2.3.x/ScalaWebSockets

于 2014-07-02T15:06:23.280 に答える