web-dev-qa-db-ja.com

socket.ioの部屋または名前空間?

リアルタイムチャットのためにnodejs/socket.ioを調査していますが、ルームを実装するためのアドバイスが必要です。

名前空間を使用するか、ルーム機能を使用して、おしゃべりのグループを互いに完全に分離する方が良いでしょうか?

部屋と名前空間の本当の技術的な違いは何ですか?

リソース使用量に違いはありますか?

146
Joseph

これは名前空間と部屋が持っているものですin common(socket.io v0.9.8-v1.0は完全な書き換えを含んでいたので、物事が変更されたかもしれないことに注意してください):

  • ネームスペース( io.of( '/ nsp') )とルーム( socket.join( 'room')サーバー側で作成
  • 複数の名前空間と複数の部屋同じ(WebSocket)接続を共有する
  • サーバーはそれらのクライアントにのみ有線でメッセージを送信する nsp /ルームに接続/参加しました。つまり、単にクライアント側のフィルタリングではありません

differences

  • 名前空間はクライアントによって接続されているio.connect(urlAndNsp)を使用して(クライアントがサーバー上に既に存在する場合のみ、その名前空間にクライアントが追加されます)
  • ルームはサーバー側でのみ参加できます(ただし、クライアントが参加できるようにサーバー側でAPIを作成するのは簡単です)
  • 名前空間は authorized protectedにできます
  • ルームでは認可は利用できませんですが、ルームの使用に専念する場合に備えて、サーバー上の前述の簡単に作成できるAPIにカスタム認可を追加できます。
  • ルームはネームスペースの一部(デフォルトは「グローバル」ネームスペース)
  • 名前空間は常にグローバルスコープに根ざしています

概念と名前(部屋または名前空間)を混同しないように、compartmentを使用して概念を参照し、他の2つの名前概念の実装。もしあなたが

  • コンパートメントごとの認証が必要、名前空間が最も簡単な方法かもしれません
  • 階層的に階層化されたコンパートメント(最大2層)が必要な場合は、名前空間/部屋のコンボを使用します
  • クライアント側アプリが異なる部分で構成されている場合(それ自体はコンパートメントを気にしないが)互いに分離する必要がある場合は、名前空間を使用します。

後者の例は、それぞれ個別にsocket.ioを使用して、おそらく個別に開発された(たとえばサードパーティ)異なるモジュールが同じアプリで使用され、単一のネットワーク接続を共有したい大規模なクライアントアプリです。

これを実際にベンチマークしていないので、メッセージを分離してグループ化するためにプロジェクト内の単純なコンパートメントだけが必要な場合、どちらかが良いように思えます。

それがあなたの質問に答えるかどうかはわかりませんが、この答えに至るまでの研究は、少なくとも私がより明確に見るのを助けました。

203

それは古い質問ですが、このトピックに関するいくつかの調査を行った後、受け入れられた答えが重要な点で明確ではないことがわかりました。 Guillermo Rauch自身による( リンクを参照 ):実行中のアプリで動的に名前空間を作成することは理論的には可能ですが、主にアプリケーションの定義済みの個別のセクションとして使用します。一方、ユーザー/接続のグループに対応するために、その場でアドホックコンパートメントを作成する必要がある場合は、ルームを使用することをお勧めします。

58
Julio Garcia

何をしたいかに依存します。

主な違いは、roomsの実装が難しいことです。ページをリロードするたびにルームに参加するためのメソッドを作成する必要があります。

namespacesを使用すると、javascript clientvar example = io.connect('http://localhost/example');と記述するだけで、クライアントは自動的にネームスペースに追加されます。

使用例:

  • 部屋:プライベートチャット。
  • 名前空間:ページのチャット。
13
user1255808

ルームとネームスペースは通信をセグメント化し、個々のソケットをグループ化します。

ルームまたは名前空間へのブロードキャストは、メンバーだけに全員に届くわけではありません。

名前空間と部屋の違いは次のとおりです。

  • 名前空間:フロントエンドで管理されます。つまり、ユーザーまたは攻撃者がフロントエンドを介して参加し、参加と切断はここで管理されます。
  • ルーム:バックエンドで管理されます。これは、サーバーがルームの参加と退室を割り当てることを意味します。

違いは主にそれらを管理する人です

使用するものを決定するには、セグメンテーションをフロントエンドで管理するかバックエンドで管理するかを決定する必要があります

2
zardilior

名前空間を使用すると、同じ名前のオブジェクトを作成できますが、異なる名前空間(スコープとも呼ばれる)に存在するため、オブジェクトは分離されます。

これは、Socket.IO名前空間で必要な同じ思考プロセスです。モジュラーNode Webアプリケーションを構築している場合、さまざまなモジュールの名前空間を削除する必要があります。名前空間のコードを振り返ると、異なる名前空間で同じイベントをリッスンできることがわかります。 Socket.IOでは、デフォルト接続の接続イベントと/ xxx名前空間の接続イベントは異なります。たとえば、サイトにチャットとコメントシステムがあり、両方をリアルタイムにしたい場合は、それぞれに名前空間を付けることができます。これにより、独自のコンテキストでのみ存続するSocket.IOアプリケーション全体を構築できます。

これは、パッケージ化してインストールするものを構築している場合にも当てはまります。誰かが既にデフォルトの名前空間で特定のイベントを使用しているかどうかを知ることはできないので、独自のイベントを作成してそこで聞く必要があります。これにより、パッケージを使用する開発者の足を踏まないようにすることができます。

名前空間を使用すると、接続をさまざまなコンテキストに分割できます。これを部屋と比較すると、接続をグループ化できます。同じ接続を他の部屋にも参加させることができます。

名前空間を使用すると、Socket.IOが動作するさまざまなコンテキストを作成できます。部屋を使用すると、これらのコンテキスト内でクライアント接続をグループ化できます。

0
faridcs