Socket.io комнаты или namespacing?

Я изучаю nodejs/socket.io для чата реального времени, и мне нужен совет для реализации комнат.

Что лучше, используя пространство имен или используя функцию комнаты, чтобы полностью изолировать grops болтовни друг от друга?

Какова реальная техническая разница между комнатами и пространством имен?

Есть ли разница в ресурсах?

Ответ 1

Это пространство имен и комнат в общем (socket.io v0.9.8 - обратите внимание, что v1.0 включил полную переписку, поэтому все могло измениться):

  • Оба пространства имен (io.of('/nsp')) и номера (socket.join('room')) создаются на стороне сервера
  • Несколько пространств имен и несколько комнат совместно используют одно и то же (WebSocket) соединение
  • Сервер будет передавать сообщения по кабелю только тем клиентам, которые подключились к /nsp/room, а не к фильтрации на стороне клиента.

Различия :

  • пространства имен связаны с клиентом с помощью io.connect(urlAndNsp) (клиент будет добавлен в это пространство имен, только если он уже существует на сервере)
  • номера могут соединяться только на стороне сервера (хотя создание API на стороне сервера, чтобы клиенты могли присоединиться к нему, было простым)
  • пространства имен могут быть защита от авторизации
  • авторизация недоступна в комнатах, но пользовательская авторизация может быть добавлена ​​к вышеупомянутому, легко создаваемому API на сервере, в случае, если кто-то склонен к использованию комнат
  • номера являются частью пространства имен (по умолчанию используется глобальное пространство имен)
  • пространства имен всегда внедрены в глобальную область

Чтобы не путать концепцию с именем (пространство или пространство имен), я буду использовать купе, чтобы ссылаться на концепцию, и на два других имени для реализации концепции. Так что если вы

  • нужна авторизация для каждого отсека, пространство имен может быть самым простым путем для выполнения
  • Если вы хотите иерархически слоистые отсеки (максимум 2 слоя), используйте пространство имен/комнатную комбинацию
  • если ваше клиентское приложение состоит из разных частей, которые (не заботятся о себе, кроме отсеков, но) должны быть отделены друг от друга, используйте пространства имен.

Примером для последнего может служить большое клиентское приложение, в котором разные модули, возможно разработанные отдельно (например, сторонние), каждый из которых использует socket.io независимо, используются в одном приложении и хотят использовать одно сетевое соединение.

Не имея на самом деле бенчмаркинга, мне кажется, что вам просто нужны простые отсеки в вашем проекте, чтобы разделить и сгруппировать сообщения, один из них в порядке.

Не уверен, что это ответит на ваш вопрос, но исследование, ведущее к этому ответу, по крайней мере помогло мне увидеть яснее.

Ответ 2

Это старый вопрос, но после ряда исследований по этой теме я обнаружил, что принятый ответ неясен в важном вопросе. Согласно самому Гильермо Рауху (см. Ссылку): хотя теоретически возможно динамически создавать пространства имен в запущенном приложении, которое вы используете в основном в виде предопределенных отдельных разделов вашего приложения. Если, с другой стороны, вам нужно создавать специальные отсеки, на лету, для размещения групп пользователей/соединений, лучше всего использовать комнаты.

Ответ 3

Это зависит от того, что вы хотите сделать.

Основное отличие состоит в том, что комнаты сложнее реализовать. Вы должны сделать способ соединения комнат с каждой перезагрузкой страницы.

С пространствами имен вам просто нужно написать var example = io.connect('http://localhost/example'); в вашем javascript-клиенте, а клиент автоматически добавится в пространства имен.

Пример использования:

  • номера: частный чат.
  • namespaces: чат страницы.

Ответ 4

Комнаты и пространства имен сегментируют связь и группируют индивидуальные розетки.

Трансляция в комнату или в пространство имен не сможет охватить всех, кроме участников.

Разница между пространствами имен и комнатами заключается в следующем:

  • Пространства имен: управляются во внешнем интерфейсе, что означает, что пользователь или злоумышленник присоединяется через внешний интерфейс, и здесь осуществляется управление присоединением и отключением.
  • Комнаты: управляются в бэкэнде, то есть сервер назначает присоединяющиеся и покидающие комнаты.

Разница главным образом в том, кто ими управляет

Чтобы решить, что использовать, вы должны решить, следует ли управлять сегментацией во внешнем интерфейсе или во внутреннем интерфейсе.