it-swarm.com.de

socket.io Räume oder Namensraum?

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 den Namespace oder die Raumfunktion verwenden, um Chatter-Gruppen vollständig voneinander zu isolieren?

was ist der wahre technische Unterschied zwischen Räumen und Namespace?

Gibt es einen Unterschied in der Ressourcennutzung?

146
Joseph

Dies ist, was Namespaces und Räume gemeinsam haben (socket.io v0.9.8 - Bitte beachten Sie, dass v1.0 ein vollständiges Umschreiben beinhaltete geändert):

  • Beide Namespaces ( io.of ('/ nsp') ) und rooms ( socket.join ('room') ) werden serverseitig angelegt
  • Mehrere Namespaces und mehrere Räume teilen sich dieselbe (WebSocket) Verbindung
  • Der Server überträgt Nachrichten über die Leitung nur an die Clients , die mit einem nsp/room verbunden/verbunden sind, d. H. Es handelt sich nicht nur um clientseitige Filterung

Die Unterschiede :

  • Namespaces werden vom Client mit io.connect(urlAndNsp) verbunden (der Client wird nur dann zu diesem Namespace 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, einfach ist)
  • Namespaces können autorisierungsgeschützt sein
  • Die Berechtigung ist für Räume nicht verfügbar , es kann jedoch eine benutzerdefinierte Berechtigung zu der oben genannten, einfach zu erstellenden API auf dem Server hinzugefügt werden, falls eine gebogen wird zur Nutzung von Räumen
  • Räume sind Teil eines Namespaces (standardmäßig der 'globale' Namespace)
  • Namespaces sind immer im globalen Gültigkeitsbereich verwurzelt

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

  • benötigen Sie die Berechtigung pro Kompartiment, könnten Namespaces der einfachste Weg sein
  • wenn Sie hierarchisch geschichtete Fächer (maximal 2 Schichten) möchten, verwenden Sie eine Namespace/Raum-Kombination
  • 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 unterschiedliche Module, die möglicherweise separat entwickelt wurden (z. B. von Drittanbietern), die jeweils socket.io unabhängig voneinander verwenden, in derselben App verwendet werden und eine einzige Netzwerkverbindung gemeinsam nutzen möchten.

Nachdem Sie dies nicht wirklich verglichen haben, scheint es mir, als ob Sie in Ihrem Projekt nur einfache Bereiche benötigen, um Nachrichten zu trennen und zu gruppieren. Beides ist in Ordnung.

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

203

Es ist eine alte Frage, aber nach einigen Nachforschungen zum 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 dagegen spontan Ad-hoc-Fächer erstellen müssen, um Gruppen von Benutzern/Verbindungen aufzunehmen, ist es am besten, Räume zu verwenden.

58
Julio Garcia

Es kommt darauf an, was du machen willst.

Der Hauptunterschied ist, dass Räume schwerer zu implementieren sind. Sie müssen eine Methode festlegen, um die Räume bei jedem Seiten-Reload zu verbinden.

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

Anwendungsbeispiel:

  • räume: privater Chat.
  • namespaces: Der Chat der Seite.
13
user1255808

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

Eine Übertragung in einen Raum oder in einen Namespace erreicht nicht jeden, sondern nur die Mitglieder.

Der Unterschied zwischen Namespaces und Räumen ist der folgende:

  • 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 ordnet Räume zu und 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

2
zardilior

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

Dies ist derselbe 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 sich unseren Namespace-Code ansehen, werden Sie feststellen, dass wir auf den gleichen Code warten konnten Genaue Ereignisse in verschiedenen Namespaces In Socket.IO sind das Verbindungsereignis für die Standardverbindung und das Verbindungsereignis für einen/xxx-Namespace unterschiedlich. Wenn Sie beispielsweise ein Chat- und Kommentarsystem auf Ihrer Site haben und beide in Echtzeit verwenden möchten Sie können jeden Namespace verwenden, um eine vollständige Socket.IO-Anwendung zu erstellen, die nur in einem eigenen Kontext ausgeführt wird.

Dies wäre auch der Fall, wenn Sie etwas erstellen würden, das verpackt und installiert werden soll. Sie können nicht wissen, ob bereits bestimmte Ereignisse im Standardnamespace verwendet werden. Erstellen Sie daher Ihre eigenen Ereignisse und hören Sie sie ab. Auf diese Weise können Sie keinem Entwickler auf die Zehen treten, der Ihr Paket verwendet.

Mit Namespaces können wir Verbindungen in verschiedene Kontexte unterteilen. 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. Mit Rooms können Sie Clientverbindungen innerhalb dieser Kontexte gruppieren.

0
faridcs