1. ホーム
  2. node.js

[解決済み] 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つのネットワーク接続を共有したい場合が挙げられます。

実際にベンチマークをしたわけではありませんが、プロジェクト内でメッセージを分離してグループ化するためのシンプルな区画が必要なだけなら、どちらでも良いように思います。

質問の答えになっているかどうかわかりませんが、この答えに至るまでの調査で、少なくとも私はより明確に理解することができました。