socket.io rooms or namespacing?

This is what namespaces and rooms have in common (socket.io v0.9.8 – please note that v1.0 involved a complete rewrite, so things might have changed):

  • Both namespaces (io.of(‘/nsp’)) and rooms (socket.join(‘room’)) are created on the server side
  • Multiple namespaces and multiple rooms share the same (WebSocket) connection
  • The server will transmit messages over the wire only to those clients that connected to / joined a nsp / room, i.e. it’s not just client-side filtering

The differences:

  • namespaces are connected to by the client using io.connect(urlAndNsp) (the client will be added to that namespace only if it already exists on the server)
  • rooms can be joined only on the server side (although creating an API on the server side to enable clients to join is straightforward)
  • namespaces can be authorization protected
  • authorization is not available with rooms, but custom authorization could be added to the aforementioned, easy-to-create API on the server, in case one is bent on using rooms
  • rooms are part of a namespace (defaulting to the ‘global’ namespace)
  • namespaces are always rooted in the global scope

To not confuse the concept with the name (room or namespace), I’ll use compartment to refer to the concept, and the other two names for the implementations of the concept. So if you

  • need per-compartment authorization, namespaces might be the easiest route to take
  • if you want hierarchically layered compartments (2 layers max), use a namespace/room combo
  • if your client-side app consists of different parts that (do not themselves care about compartments but) need to be separated from each other, use namespaces.

An example for the latter would be a large client app where different modules, perhaps developed separately (e.g. third-party), each using socket.io independently, are being used in the same app and want to share a single network connection.

Not having actually benchmarked this, it seems to me if you just need simple compartments in your project to separate and group messages, either one is fine.

Not sure if that answers your question, but the research leading up to this answer at least helped me see clearer.

Leave a Comment