socket.io habitaciones o espacios de nombres?

163

Estoy investigando nodejs / socket.io para chatear en tiempo real, y necesito algunos consejos para implementar salas.

¿Qué es mejor, usar el espacio de nombres o la función de sala para aislar por completo los grupos de chat entre sí?

¿Cuál es la verdadera diferencia técnica entre las habitaciones y el espacio de nombres?

¿Hay alguna diferencia en el uso de recursos?

Joseph
fuente

Respuestas:

216

Esto es lo que tienen en común los espacios de nombres y las salas (socket.io v0.9.8; tenga en cuenta que la v1.0 implica una reescritura completa, por lo que las cosas podrían haber cambiado):

  • Ambos espacios de nombres ( io.of ('/ nsp') ) y rooms ( socket.join ('room') ) se crean en el lado del servidor
  • Múltiples espacios de nombres y múltiples salas comparten la misma conexión (WebSocket)
  • El servidor transmitirá mensajes por cable solo a aquellos clientes que se conectaron / se unieron a un nsp / room, es decir, no se trata solo del filtrado del lado del cliente

Las diferencias :

  • el cliente conecta los espacios de nombres utilizando io.connect(urlAndNsp)(el cliente se agregará a ese espacio de nombres solo si ya existe en el servidor)
  • las salas se pueden unir solo en el lado del servidor (aunque crear una API en el lado del servidor para permitir que los clientes se unan es sencillo)
  • los espacios de nombres pueden estar protegidos por autorización
  • la autorización no está disponible con salas , pero se podría agregar una autorización personalizada a la API mencionada y fácil de crear en el servidor, en caso de que uno esté decidido a usar salas
  • las habitaciones son parte de un espacio de nombres (por defecto al espacio de nombres 'global')
  • los espacios de nombres siempre tienen sus raíces en el ámbito global

Para no confundir el concepto con el nombre (habitación o espacio de nombres), usaré el compartimento para referirme al concepto, y los otros dos nombres para las implementaciones del concepto. Así que si usted

  • necesita autorización por compartimento , los espacios de nombres pueden ser la ruta más fácil de tomar
  • si tu quieres compartimentos jerárquicamente en capas (2 capas como máximo), use un combo de espacio de nombres / sala
  • si su aplicación del lado del cliente consta de diferentes partes que (no se preocupan por los compartimentos, pero) necesitan separarse entre sí, use espacios de nombres.

Un ejemplo para este último sería una gran aplicación cliente donde diferentes módulos, quizás desarrollados por separado (por ejemplo, de terceros), cada uno usando socket.io de forma independiente, se están utilizando en la misma aplicación y desean compartir una conexión de red única.

Al no haber evaluado esto, me parece que si solo necesita compartimentos simples en su proyecto para separar y agrupar mensajes, cualquiera de los dos está bien.

No estoy seguro de si eso responde a su pregunta, pero la investigación que condujo a esta respuesta al menos me ayudó a ver más claramente.

Eugene Beresovsky
fuente
55
¿Hay algo importante que haya cambiado en esto después de la versión socket.io> = 1.0?
Xeroxoid
2
Cambios en la última versión, lea socket.io/docs/rooms-and-namespaces y esta respuesta puede ser útil para comprender las cosas de las habitaciones stackoverflow.com/questions/24041220/…
Gonzalo Bahamondez
1
¿Podemos decir que el espacio de nombres es un área determinada de mi aplicación web y un grupo de clientes en esa área?
Onaiggac
¿Puede agregar algo al desconectarse de una sala / espacio de nombres? Qué les sucede cuando el cliente desconecta o pierde la conexión temporalmente. Aquí está escrito: Al desconectarse, los enchufes dejan todos los canales de los que formaron parte automáticamente, y no es necesario un desmontaje especial de su parte. ¿Es un canal igual a su compartimento ?
marchita el
67

Es una pregunta antigua, pero después de investigar un poco sobre el tema, encuentro que la respuesta aceptada no está clara en un punto importante. Según el propio Guillermo Rauch ( ver enlace ): aunque es teóricamente posible crear espacios de nombres dinámicamente en una aplicación en ejecución, los usa principalmente como secciones separadas predefinidas de su aplicación. Si, por otro lado, necesita crear compartimentos ad hoc, sobre la marcha, para acomodar grupos de usuarios / conexiones, lo mejor es usar habitaciones.

Julio García
fuente
3
¡Gusta! Espacios de nombres: conexiones predefinidas. Habitaciones - Conexiones dinámicas
Nandakumar
16

Depende de lo que quieras hacer.

La principal diferencia es que las habitaciones son más difíciles de implementar. Debe crear un método para unirse a las salas con cada recarga de página.

Con espacios de nombres solo necesita escribir var example = io.connect('http://localhost/example');en su cliente javascript y el cliente se agrega automáticamente en los espacios de nombres.

Ejemplo de utilización:

  • salas: chat privado.
  • espacios de nombres: el chat de la página.

fuente
2

Las habitaciones y los espacios de nombres segmentan la comunicación y agrupan tomas individuales.

Una transmisión a una sala o un espacio de nombres no llegará a todos, solo a los miembros.

La diferencia entre espacios de nombres y habitaciones es la siguiente:

  • Espacios de nombres: se gestionan en la interfaz, lo que significa que el usuario, o un atacante, se une a través de la interfaz y aquí se gestiona la unión y desconexión.
  • Salas: se gestionan en el back-end, lo que significa que el servidor asigna salas de unión y salida.

La diferencia es principalmente quién los maneja

Para decidir qué usar, debe decidir si la segmentación se debe administrar en el frontend o en el backend

zardilior
fuente
0

Los espacios de nombres le permiten crear objetos con el mismo nombre, pero estarían separados ya que vivirán en espacios de nombres diferentes, también conocidos como ámbitos.

Este es el mismo proceso de pensamiento que debería tener con los espacios de nombres Socket.IO. Si está creando una aplicación web modular Node, deseará espaciar los nombres de los diferentes módulos. Si vuelve a mirar nuestro código de espacio de nombres, verá que pudimos escuchar los mismos eventos exactos en diferentes espacios de nombres. En Socket.IO, el evento de conexión en la conexión predeterminada y el evento de conexión en un espacio de nombres / xxx son diferentes. Por ejemplo, si tenía un sistema de chat y comentarios en su sitio y deseaba que ambos fueran en tiempo real, podría asignar un espacio de nombres a cada uno. Esto le permite crear una aplicación Socket.IO completa que solo vive en su propio contexto.

Esto también sería cierto si estuviera construyendo algo para ser empaquetado e instalado. No puede saber si alguien ya está usando ciertos eventos en el espacio de nombres predeterminado, por lo que debe crear los suyos y escucharlos allí. Esto le permite no pisotear a ningún desarrollador que use su paquete.

Los espacios de nombres nos permiten dividir las conexiones en diferentes contextos. Podemos comparar esto con las salas, lo que nos permite agrupar las conexiones. También podemos hacer que la misma conexión se una a otras salas también.

Los espacios de nombres le permiten crear diferentes contextos para que Socket.IO funcione. Las habitaciones le permiten agrupar conexiones de clientes dentro de esos contextos.

faridcs
fuente