socket.ioルームまたは名前空間?


163

リアルタイムチャット用にnodejs / socket.ioを調査しており、部屋の実装についていくつかのアドバイスが必要です。

名前空間を使用するか、部屋機能を使用して、おしゃべりの群れを互いに完全に分離するのが良いでしょうか?

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

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

回答:


216

これは、名前空間とルームに共通するものです(socket.io v0.9.8-v1.0は完全な書き直しを伴うため、状況が変わっている可能性があることに注意してください)。

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

違い

  • 名前空間はクライアントを使用して接続されますio.connect(urlAndNsp)(サーバーにすでに存在する場合にのみ、クライアントはその名前空間に追加されます)
  • ルームはサーバー側でのみ参加できますサーバー側で APIを作成してクライアントが参加できるようにするのは簡単です)
  • 名前空間は認証保護することができます
  • 部屋は認証を使用できませんが、部屋の使用に慣れている場合は、サーバー上で前述の簡単に作成できるAPIにカスタム認証を追加できます。
  • 部屋は名前空間の一部です(デフォルトは「グローバル」名前空間)
  • 名前空間は常にグローバルスコープをルートとする

概念と名前(部屋または名前空間)を混同しないように、コンパートメントを使用して概念を参照し、他の2つの名前を使用して概念を実装します。だからあなたが

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

後者の例は、別々に開発された可能性のある異なるモジュール(サードパーティなど)がそれぞれ独立してsocket.ioを使用し、同じアプリで使用され、単一のネットワーク接続を共有したい大きなクライアントアプリです。

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

それがあなたの質問に答えるかどうかはわかりませんが、この答えに至るまでの調査は少なくとも私がより明確に見るのに役立ちました。


5
socket.ioバージョン> = 1.0以降、これで変更されたメジャーはありますか?
Xeroxoid 2015年

2
最後のバージョンでの変更点は、読み socket.io/docs/rooms-and-namespacesをし、この答えは、お部屋の事を理解するために有用である可能 stackoverflow.com/questions/24041220/...
ゴンサロBahamondez

1
名前空間は私のWebアプリの特定の領域であり、その領域にクライアントのグループを配置すると言えるでしょうか。
Onaiggac 2015

部屋/名前空間から切断するときについて何か追加できますか?クライアントが接続を一時的に切断または切断すると、それらはどうなりますか。ここに書かれています:切断すると、ソケットはそれらが含まれていたすべてのチャネルを自動的に残し、特別にティアダウンする必要はありません。あるチャンネルは、あなたと同じコンパートメント
Wilt

67

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


3
いいね!名前空間-定義済みの接続。客室-ダイナミックコネクション
Nandakumar

16

それはあなたが何をしたいかによります。

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

では名前空間あなただけ記述する必要が var example = io.connect('http://localhost/example');あなたにJavaScriptクライアントとクライアントが自動的に名前空間に追加されます。

利用例:

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

2

部屋と名前空間は通信をセグメント化し、個々のソケットをグループ化します。

部屋または名前空間へのブロードキャストは、メンバーだけに届くことはありません。

名前空間とルームの違いは次のとおりです。

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

違いは主に誰が管理するかです

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


0

名前空間を使用すると、同じ名前のオブジェクトを作成できますが、スコープは別の名前空間に存在するため、それらは別の名前空間に存在するため、別々になります。

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

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

名前空間を使用すると、接続をさまざまなコンテキストに分割できます。これをルームと比較すると、接続をグループ化できるため、同じ接続を他のルームに結合することもできます。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.