私は 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 人以上のユーザー) を処理できることも知りたいです。ありがとうございました。