¿habitaciones socket.io o namespacing?

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

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

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

¿Hay alguna diferencia de uso de recursos?

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

  • Ambos espacios de nombres ( io.of (‘/ nsp’) ) y habitaciones ( socket.join (‘room’) ) se crean en el lado del servidor
  • Múltiples espacios de nombres y varias habitaciones comparten la misma conexión (WebSocket)
  • El servidor transmitirá mensajes a través del cable solo a aquellos clientes que se conectaron / se unieron a un nsp / room, es decir, no es solo un filtro del lado del cliente

Las diferencias :

  • espacios de nombres están conectados por el cliente utilizando io.connect(urlAndNsp) (el cliente se agregará a ese espacio de nombres solo si ya existe en el servidor)
  • las salas solo se pueden unir por el lado del servidor (aunque la creación de una API en el servidor para permitir a los clientes unirse es sencillo)
  • espacios de nombres pueden ser protegidos por autorización
  • la autorización no está disponible con las habitaciones , pero la autorización personalizada podría agregarse a la API mencionada anteriormente, fácil de crear en el servidor, en caso de que uno esté empeñado en usar habitaciones
  • las habitaciones son parte de un espacio de nombres (predeterminado en el espacio de nombres ‘global’)
  • espacios de nombres siempre están enraizados en el scope global

Para no confundir el concepto con el nombre (sala 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 compartimiento , los espacios de nombres pueden ser la ruta más fácil de tomar
  • si desea compartimientos jerárquicamente estratificados (2 capas máx.), use un espacio de nombres / sala combo
  • Si su aplicación del lado del cliente consiste en diferentes partes que (no les interesan los compartimentos sino) deben separarse, use espacios de nombres.

Un ejemplo para este último sería una gran aplicación cliente donde diferentes módulos, tal vez 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 única conexión de red.

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

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

Es una vieja pregunta, pero después de hacer algunas investigaciones sobre el tema, encuentro que la respuesta aceptada no es clara en un punto importante. Según el propio Guillermo Rauch ( ver enlace ): aunque teóricamente es posible crear espacios de nombres dinámicamente en una aplicación en ejecución, los utilizas principalmente como secciones separadas predefinidas de tu 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.

Depende de lo que quieras hacer.

La principal diferencia es que las salas son más difíciles de implementar. Debe crear un método para unir 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 y cliente de JavaScript se agregan automáticamente en los espacios de nombres.

Ejemplo de utilización:

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