web-dev-qa-db-fra.com

socket.io chambres ou nomspacing?

J'étudie nodejs/socket.io pour un chat en temps réel et j'ai besoin de conseils pour la mise en place de salles.

Quel est le meilleur, utiliser un espace de noms ou la fonctionnalité room pour isoler complètement les groupes de participants les uns aux autres?

quelle est la vraie différence technique entre les salles et l'espace de noms?

Existe-t-il une différence d'utilisation des ressources?

146
Joseph

Ceci est ce que les espaces de noms et les chambres ont en commun (socket.io v0.9.8 - veuillez noter que la v1.0 impliquait une réécriture complète. modifié):

  • Les deux espaces de noms ( io.of ('/ nsp') ) et les pièces ( socket.join ('room') ) sont créés côté serveur
  • Plusieurs espaces de noms et plusieurs salles partagent la même connexion (WebSocket)
  • Le serveur ne transmettra les messages sur le réseau qu'aux clients qui se sont connectés à/ont rejoint un nsp/room, c'est-à-dire qu'il ne s'agit pas uniquement d'un filtrage côté client.

Les différences :

  • les espaces de noms sont connectés au client à l'aide de io.connect(urlAndNsp) (le client sera ajouté à cet espace de noms uniquement s'il existe déjà sur le serveur). )
  • les salles ne peuvent être jointes que du côté serveur (bien que la création d'une API côté serveur pour permettre aux clients de se joindre est simple)
  • Les espaces de noms peuvent être autorisation protégée
  • L'autorisation n'est pas disponible avec les salles , mais une autorisation personnalisée pourrait être ajoutée à l'API susmentionnée, facile à créer sur le serveur, au cas où l'une d'entre elles serait pliée. sur l'utilisation des salles
  • les pièces font partie d'un espace de noms (par défaut, l'espace de noms 'global')
  • Les espaces de noms sont toujours enracinés dans la portée globale

Pour ne pas confondre le concept avec le nom (room ou namespace), je vais utiliser compartiment pour faire référence au concept et aux deux autres noms pour implémentations = du concept. Donc si tu

  • besoin autorisation par compartiment, les espaces de noms pourraient être la voie la plus facile à prendre
  • si vous voulez des compartiments à couches hiérarchiques (2 couches maximum), utilisez un combo espace de noms/pièce
  • si votre application côté client se compose de différentes parties qui (ne se soucient pas elles-mêmes des compartiments mais) doivent être séparées les unes des autres, utilisez des espaces de noms.

Un exemple pour cette dernière serait une application client volumineuse dans laquelle différents modules, développés séparément (par exemple par des tiers), utilisant chacun indépendamment socket.io, sont utilisés dans la même application et souhaitent partager une seule connexion réseau.

N'ayant pas réellement comparé cela, il me semble que si vous avez simplement besoin de compartiments simples dans votre projet pour séparer et grouper les messages, l'un ou l'autre convient.

Pas sûr que cela réponde à votre question, mais les recherches qui ont conduit à cette réponse m'ont au moins aidé à voir plus clair.

203
Eugene Beresovsky

C'est une vieille question mais après avoir fait quelques recherches sur le sujet, je trouve que la réponse acceptée n'est pas claire sur un point important. Selon Guillermo Rauch lui-même ( voir lien ): bien qu'il soit théoriquement possible de créer des espaces de nom de manière dynamique sur une application en cours d'exécution, vous les utilisez principalement en tant que sections distinctes prédéfinies de votre application. Si, par contre, vous devez créer des compartiments ad hoc, à la volée, pour accueillir des groupes d’utilisateurs/connexions, il est préférable d’utiliser des salles.

58
Julio Garcia

Cela dépend de ce que tu veux faire.

La principale différence est que chambres sont plus difficiles à mettre en œuvre. Vous devez créer une méthode pour joindre les salles à chaque rechargement de page.

Avec namespaces il vous suffit d’écrire var example = io.connect('http://localhost/example'); dans votre client javascript et le client est automatiquement ajouté dans le espaces de noms.

Exemple d'utilisation:

  • chambres: chat privé.
  • namespaces: le chat de la page.
13
user1255808

Les salles et les espaces de noms segmentent la communication et les prises individuelles de groupe.

Une diffusion dans une salle ou dans un espace de noms ne parviendra pas à tout le monde, mais uniquement aux membres.

La différence entre les espaces de noms et les salles est la suivante:

  • Les espaces de noms: sont gérés dans le frontend, ce qui signifie que l'utilisateur, ou un attaquant, se joint à travers l'interface, ce qui permet de les associer et de les déconnecter.
  • Les salles: sont gérées dans le backend, ce qui signifie que le serveur affecte les salles de connexion et de sortie.

La différence est principalement qui les gère

Pour décider quoi utiliser, vous devez décider si la segmentation doit être gérée dans le frontend ou dans le backend

2
zardilior

Les espaces de noms vous permettent de créer des objets portant le même nom, mais ils seraient séparés car ils vivront dans des espaces de noms différents, également appelés étendues.

C'est le même processus de réflexion que vous devriez avoir avec les espaces de noms Socket.IO. Si vous construisez une application Web modulaire Node, vous souhaiterez créer un espace de noms entre les différents modules. Si vous revenez au code de notre espace de noms, vous verrez que nous avons pu l'écouter de la même manière. Événements exacts dans différents espaces de noms. Dans Socket.IO, l'événement de connexion sur la connexion par défaut et l'événement de connexion sur un espace de noms/xxx sont différents. Par exemple, si vous aviez un système de discussion et de commentaires sur votre site et vouliez que les deux soient en temps réel. Vous pouvez créer l’ensemble d’une application Socket.IO qui ne vit que dans son propre contexte.

Cela serait également vrai si vous construisiez quelque chose à emballer et à installer. Vous ne pouvez pas savoir si quelqu'un utilise déjà certains événements dans l'espace de noms par défaut. Vous devez donc créer le vôtre et y écouter. Cela vous permet de ne pas marcher sur les pieds des développeurs qui utilisent votre paquet.

Les espaces de noms nous permettent de scinder des connexions dans différents contextes. Nous pouvons comparer cela à des salles, ce qui nous permet de regrouper des connexions. Nous pouvons alors avoir la même connexion pour joindre d'autres salles.

Les espaces de noms vous permettent de créer différents contextes dans lesquels Socket.IO doit travailler. Les salles vous permettent de regrouper les connexions client dans ces contextes.

0
faridcs