[解決済み] socket.ioの部屋かnamespacingか?
2022-04-20 07:52:27
質問
リアルタイムチャットのためにnodejs/socket.ioを調査しているのですが、ルームを実装するためのアドバイスが欲しいです。
名前空間を使うのと、ルーム機能を使ってチャッターのグループを完全に分離するのと、どちらが良いでしょうか?
ルームとネームスペースの本当の技術的な違いは何ですか?
リソース使用量に違いはありますか?
解決方法は?
ネームスペースとルームにはこんなものがあります 共通 (socket.io v0.9.8 - v1.0では完全に書き直されたので、変更されている可能性があります)。
- 両方の名前空間( io.of('/nsp') ) とルーム ( ソケット.join('部屋') ) はサーバー側で作成されます
- 複数の名前空間と複数の部屋 同じ(WebSocket)接続を共有する
- サーバーは メッセージを送信するのは、以下のクライアントのみです。 つまり、クライアント側のフィルタリングだけではありません。
その 相違点 :
-
名前空間は、クライアントから接続される
を使って
io.connect(urlAndNsp)
(クライアントがその名前空間を追加するのは、 それがサーバに既に存在する場合のみです) - 部屋への参加はサーバー側からのみ可能 (ただし、サーバー側でAPIを作成し、クライアントが参加できるようにすることは簡単です)
- 名前空間は 認証保護
- オーソライゼーションは、部屋では利用できません しかし、rooms の使用に固執する場合は、前述の簡単に作成できるサーバー上の API にカスタム認証を追加することができます。
- rooms は名前空間の一部である (デフォルトは 'global' 名前空間)
- 名前空間は常にグローバルスコープにルートされます。
概念と名前(部屋や名前空間)を混同しないように、ここでは コンパートメント という名前で概念を示し、他の2つの名前は 実装 という概念があります。ですから、もし
- 必要 コンパートメント単位の認可 名前空間は、最も簡単な方法かもしれません。
- を希望する場合 階層化されたコンパートメント (最大2層)、ネームスペースとルームのコンボを使用します。
- クライアントサイドのアプリが、互いに分離する必要のある(それ自体はコンパートメントを気にしない)異なるパーツで構成されている場合、名前空間を使用します。
後者の例としては、大規模なクライアントアプリで、おそらく別々に開発された(サードパーティなど)異なるモジュールがそれぞれ独立してsocket.ioを使用しており、同じアプリで1つのネットワーク接続を共有したい場合が挙げられます。
実際にベンチマークをしたわけではありませんが、プロジェクト内でメッセージを分離してグループ化するためのシンプルな区画が必要なだけなら、どちらでも良いように思います。
質問の答えになっているかどうかわかりませんが、この答えに至るまでの調査で、少なくとも私はより明確に理解することができました。
関連
-
[解決済み】エラー TRK0005: 位置特定に失敗しました。"CL.exe"
-
[解決済み】MongoDBでコレクションを日付で並べ替えるには?
-
[解決済み】MongoDBのデータ/DBが見つからない
-
[解決済み】モジュール '@babel/core' が見つかりません。
-
[解決済み】MongooseでEnumを作成し使用する方法
-
[解決済み】E11000重複キーエラー mongodb mongooseのインデックス
-
[解決済み] EventEmitter のメモリリークの可能性が検出された
-
[解決済み] node.jsのセットアップウィザードが途中で終了してしまう
-
[解決済み] ノードのバージョンを管理するためのnまたはnvm - 各バージョンのグローバルモジュールを保持することは良いアイデアですか?
-
[解決済み] socket.ioとwebsocketの違いについて
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] リソースの読み込みに失敗しました: net::ERR_CONNECTION_REFUSED : Nodejs
-
[解決済み】Node.jsのエラーECONNRESETをデバッグするにはどうすればよいですか?
-
[解決済み】Nodejsの解決方法:Error: ENOENT: そのようなファイルまたはディレクトリがありません
-
[解決済み] create-react-app、インストールエラー("コマンドが見つからない")。
-
[解決済み] EventEmitter のメモリリークの可能性が検出された
-
[解決済み] TypeError: コールバックはnodejsの関数ではありません。
-
[解決済み] Node.jsで「btoaが定義されていない」エラーが発生する
-
[解決済み] MongoNetworkError: 最初の接続でサーバー [localhost:27017] への接続に失敗 [MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017] 。
-
[解決済み] DynamoDBで一括削除するにはどうしたらいいですか?
-
[解決済み] エラー: ノード出力を "|head" にパイプするときに EPIPE を書き込む。