socket.io Räume oder Namespace?

163

Ich untersuche nodejs / socket.io für Echtzeit-Chats und benötige einige Ratschläge für die Implementierung von Räumen.

Was ist besser, wenn Sie einen Namespace verwenden oder die Raumfunktion verwenden, um eine Vielzahl von Chatter vollständig voneinander zu isolieren?

Was ist der eigentliche technische Unterschied zwischen Räumen und Namespace?

Gibt es einen Unterschied in der Ressourcennutzung?

Joseph
quelle

Antworten:

216

Dies ist, was Namespaces und Räume gemeinsam haben (socket.io v0.9.8 - Bitte beachten Sie, dass v1.0 eine vollständige Neufassung beinhaltete, sodass sich die Dinge möglicherweise geändert haben):

  • Auf der Serverseite werden sowohl Namespaces ( io.of ('/ nsp') ) als auch Räume ( socket.join ('room') ) erstellt
  • Mehrere Namespaces und mehrere Räume teilen sich dieselbe (WebSocket) Verbindung
  • Der Server überträgt Nachrichten über das Kabel nur an diejenigen Clients , die mit einem nsp / room verbunden sind / diesem beigetreten sind, dh es handelt sich nicht nur um clientseitige Filterung

Die Unterschiede :

  • Namespaces werden vom Client mithilfe von verbunden io.connect(urlAndNsp)(der Client wird diesem Namespace nur hinzugefügt, wenn er bereits auf dem Server vorhanden ist).
  • Räume können nur auf der Serverseite verbunden werden (obwohl das Erstellen einer API auf der Serverseite, damit Clients beitreten können, unkompliziert ist)
  • Namespaces können autorisierungsgeschützt sein
  • Die Autorisierung ist für Räume nicht verfügbar , aber der oben genannten, einfach zu erstellenden API auf dem Server kann eine benutzerdefinierte Autorisierung hinzugefügt werden, falls Sie Räume verwenden möchten
  • Räume sind Teil eines Namespace (standardmäßig der 'globale' Namespace)
  • Namespaces sind immer im globalen Bereich verwurzelt

Um das Konzept nicht mit dem Namen (Raum oder Namespace) zu verwechseln, verwende ich das Fach , um auf das Konzept zu verweisen, und die beiden anderen Namen für die Implementierung des Konzepts. Also, wenn Sie

  • Bedarf pro Fach Genehmigung , Namespaces könnte der einfachste Weg sein zu nehmen
  • Wenn Sie hierarchisch geschichtete Fächer (maximal 2 Schichten) möchten , verwenden Sie eine Kombination aus Namespace und Raum
  • Wenn Ihre clientseitige App aus verschiedenen Teilen besteht, die (sich selbst nicht um Fächer kümmern, sondern voneinander getrennt werden müssen), verwenden Sie Namespaces.

Ein Beispiel für Letzteres wäre eine große Client-App, bei der verschiedene Module, die möglicherweise separat entwickelt wurden (z. B. von Drittanbietern) und jeweils unabhängig voneinander socket.io verwenden, in derselben App verwendet werden und eine einzelne Netzwerkverbindung gemeinsam nutzen möchten.

Wenn Sie dies nicht tatsächlich bewertet haben, scheint es mir, dass beide in Ordnung sind, wenn Sie in Ihrem Projekt nur einfache Fächer benötigen, um Nachrichten zu trennen und zu gruppieren.

Ich bin mir nicht sicher, ob das Ihre Frage beantwortet, aber die Forschung, die zu dieser Antwort geführt hat, hat mir zumindest geholfen, klarer zu sehen.

Eugene Beresovsky
quelle
5
Gibt es irgendetwas Wichtiges, das sich nach socket.io version> = 1.0 geändert hat?
Xeroxoid
2
Änderungen in der letzten Version, lesen Sie socket.io/docs/rooms-and-namespaces und diese Antwort kann nützlich sein, um Raum
Gonzalo Bahamondez
1
Können wir sagen, dass der Namespace ein bestimmter Bereich meiner Web-App ist und eine Gruppe von Kunden in diesem Bereich untergebracht ist?
Onaiggac
Können Sie etwas hinzufügen, wenn Sie die Verbindung zu einem Raum / Namespace trennen? Was passiert mit ihnen, wenn der Client die Verbindung trennt oder vorübergehend verliert? Hier steht geschrieben: Beim Trennen verlassen Sockets automatisch alle Kanäle, zu denen sie gehörten, und es ist kein spezielles Herunterfahren von Ihrer Seite erforderlich. Ist ein Kanal das gleiche wie Ihr Fach ?
Wilt
67

Es ist eine alte Frage, aber nach einigen Recherchen zu diesem Thema stelle ich fest, dass die akzeptierte Antwort in einem wichtigen Punkt nicht klar ist. Laut Guillermo Rauch selbst ( siehe Link ): Obwohl es theoretisch möglich ist, Namespaces dynamisch in einer laufenden App zu erstellen, verwenden Sie diese hauptsächlich als vordefinierte separate Abschnitte Ihrer Anwendung. Wenn Sie andererseits im laufenden Betrieb Ad-hoc-Fächer erstellen müssen, um Gruppen von Benutzern / Verbindungen aufzunehmen, ist es am besten, Räume zu verwenden.

Julio Garcia
quelle
3
Mag ich! Namespaces - Vordefinierte Verbindungen. Zimmer - Dynamische Verbindungen
Nandakumar
16

Es kommt darauf an, was du machen willst.

Der Hauptunterschied besteht darin, dass Räume schwieriger zu implementieren sind. Sie müssen bei jedem erneuten Laden der Seite eine Methode zum Verbinden der Räume festlegen.

Bei Namespaces müssen Sie nur var example = io.connect('http://localhost/example');in Ihren Javascript-Client schreiben, und der Client wird automatisch in die Namespaces eingefügt.

Anwendungsbeispiel:

  • Zimmer: privater Chat.
  • Namespaces: Der Chat der Seite.

quelle
2

Räume und Namespaces segmentieren die Kommunikation und gruppieren einzelne Steckdosen.

Eine Sendung in einen Raum oder in einen Namespace erreicht nicht alle, nur die Mitglieder.

Der Unterschied zwischen Namespaces und Räumen ist folgender:

  • Namespaces: werden im Frontend verwaltet, dh der Benutzer oder ein Angreifer tritt über das Frontend bei, und das Verbinden und Trennen wird hier verwaltet.
  • Räume: werden im Backend verwaltet, dh der Server weist das Beitreten und Verlassen von Räumen zu.

Der Unterschied besteht hauptsächlich darin, wer sie verwaltet

Um zu entscheiden, was verwendet werden soll, müssen Sie entscheiden, ob die Segmentierung im Frontend oder im Backend verwaltet werden soll

zardilior
quelle
0

Mit Namespaces können Sie Objekte mit demselben Namen erstellen, diese sind jedoch getrennt, da sie in verschiedenen Namespaces (auch als Bereiche bezeichnet) leben.

Dies ist der gleiche Denkprozess, den Sie mit Socket.IO-Namespaces haben sollten. Wenn Sie eine modulare Node-Webanwendung erstellen, möchten Sie die verschiedenen Module mit einem Namespace versehen. Wenn Sie auf unseren Namespace-Code zurückblicken, werden Sie feststellen, dass wir in verschiedenen Namespaces genau dieselben Ereignisse abhören konnten. In Socket.IO unterscheiden sich das Verbindungsereignis für die Standardverbindung und das Verbindungsereignis für einen / xxx-Namespace. Wenn Sie beispielsweise ein Chat- und Kommentarsystem auf Ihrer Website haben und möchten, dass beide in Echtzeit ausgeführt werden, können Sie jeweils einen Namespace verwenden. Auf diese Weise können Sie eine gesamte Socket.IO-Anwendung erstellen, die nur in ihrem eigenen Kontext lebt.

Dies gilt auch, wenn Sie etwas erstellen, das verpackt und installiert werden soll. Sie können nicht wissen, ob jemand bereits bestimmte Ereignisse im Standard-Namespace verwendet. Erstellen Sie daher eigene Ereignisse und hören Sie dort zu. Auf diese Weise können Sie keinem Entwickler auf die Zehen treten, der Ihr Paket verwendet.

Namespaces ermöglichen es uns, Verbindungen in verschiedene Kontexte zu zerlegen. Wir können dies mit Räumen vergleichen, die es uns ermöglichen, Verbindungen zu gruppieren. Wir können dann dieselbe Verbindung auch mit anderen Räumen verbinden.

Mit Namespaces können Sie verschiedene Kontexte erstellen, in denen Socket.IO arbeiten kann. In Räumen können Sie Clientverbindungen innerhalb dieser Kontexte gruppieren.

faridcs
quelle