socket.io 방 또는 네임 스페이스?


163

실시간 채팅을 위해 nodejs / socket.io를 조사 중이며 회의실 구현에 대한 조언이 필요합니다.

네임 스페이스를 사용하거나 룸 기능을 사용하여 채터 그룹을 서로 완전히 격리시키는 것이 더 좋은 방법은 무엇입니까?

회의실과 네임 스페이스의 실제 기술적 차이점은 무엇입니까?

리소스 사용량 차이가 있습니까?

답변:


216

이것은 네임 스페이스와 룸이 공통적으로 갖는 것 입니다 (socket.io v0.9.8-v1.0은 완전히 다시 작성되므로 변경 사항이있을 수 있습니다).

  • 네임 스페이스 ( io.of ( '/ nsp') )와 회의실 ( socket.join ( 'room') ) 은 모두 서버 측에서 작성됩니다.
  • 여러 네임 스페이스와 여러 방 에서 동일한 (WebSocket) 연결을 공유
  • 서버는 유선 으로 nsp / 방에 연결 / 가입 한 클라이언트에게만 메시지를 전송합니다 . 즉, 클라이언트 측 필터링이 아닙니다.

차이 :

  • 네임 스페이스는 클라이언트를 사용하여 연결됩니다io.connect(urlAndNsp) (클라이언트는 서버에 이미 존재하는 경우에만 해당 네임 스페이스에 추가됨).
  • 서버 측에서만 미팅 룸 에 참여할 수 있습니다 (클라이언트가 참여할 수 있도록 서버 측에서 API를 작성하는 것이 간단하지만)
  • 네임 스페이스는 인증으로 보호 될 수 있습니다
  • rooms 에서는 권한 부여를 사용할 수 없지만, 룸 사용에 구부러진 경우 서버에서 앞서 작성하기 쉬운 API에 사용자 정의 권한 부여를 추가 할 수 있습니다.
  • rooms은 네임 스페이스의 일부입니다 (기본값은 'global'네임 스페이스).
  • 네임 스페이스는 항상 글로벌 범위에 뿌리를두고 있습니다

개념을 이름 (방 또는 네임 스페이스)과 혼동하지 않기 위해 구획 을 사용 하여 개념과 개념 구현 을 위한 다른 두 이름을 사용하겠습니다 . 그래서 당신이

  • 구획 별 인증이 필요 하며 네임 스페이스는 가장 쉬운 경로 일 수 있습니다.
  • 계층 적으로 계층화 된 구획 (최대 2 층) 을 원할 경우 네임 스페이스 / 룸 콤보를 사용하십시오
  • 클라이언트 측 앱이 구획을 신경 쓰지 않고 서로 분리해야하는 다른 부분으로 구성된 경우 네임 스페이스를 사용하십시오.

후자의 예로는 각각 개별적으로 (예 : 타사) 모듈 (각각 socket.io를 독립적으로 사용하는)이 동일한 앱에서 사용되고 단일 네트워크 연결을 공유하려는 대규모 클라이언트 앱이 있습니다.

실제로 이것을 벤치마킹하지 않은 상태에서 프로젝트에서 메시지를 분리하고 그룹화하기 위해 간단한 구획이 필요한 경우 어느 쪽이든 좋습니다.

그것이 귀하의 질문에 대한 답변인지 확실하지 않지만이 답변을 이끌어내는 연구는 적어도 더 명확하게 보는 데 도움이되었습니다.


5
socket.io version> = 1.0 이후에 변경된 내용이 있습니까?
Xeroxoid

2
마지막 버전의 변경 사항 인 socket.io/docs/rooms-and-namespaces를 읽고이 답변은 방을 이해하는 데 유용 할 수 있습니다. stackoverflow.com/questions/24041220/…
Gonzalo Bahamondez

1
네임 스페이스가 웹앱의 특정 영역이고 해당 영역에 클라이언트 그룹이있을 수 있다고 말할 수 있습니까?
Onaiggac

방 / 네임 스페이스에서 연결을 끊을 때 무언가를 추가 할 수 있습니까? 클라이언트가 연결을 일시적으로 끊거나 느슨하게하면 어떻게됩니까? 다음과 같이 씁니다. 연결이 끊어지면 소켓은 자동으로 일부인 모든 채널을 남겨두고 특별히 분해 할 필요는 없습니다. A는 채널 당신과 같은 구획 ?
Wilt

67

그것은 오래된 질문이지만 주제에 대해 약간의 연구를 한 후에 받아 들인 대답이 중요한 점에서 명확하지 않다는 것을 알았습니다. Guillermo Rauch 자신에 따르면 ( 링크 참조 ) : 이론적으로 실행중인 앱에서 네임 스페이스를 동적으로 생성 할 수 있지만 기본적으로 애플리케이션의 사전 정의 된 별도 섹션으로 네임 스페이스를 사용합니다. 반면에 사용자 / 연결 그룹을 수용하기 위해 즉석에서 임시 구획을 작성해야하는 경우 회의실을 사용하는 것이 가장 좋습니다.


3
좋아요! 네임 스페이스-사전 정의 된 연결 객실-동적 연결
Nandakumar

16

당신이하고 싶은 일에 달려 있습니다.

가장 큰 차이점은 객실 을 구현하기가 어렵다는 것입니다. 각 페이지를 새로 고칠 때마다 회의실에 참여할 수있는 방법을 만들어야합니다.

함께 네임 스페이스 당신은 쓸 필요가 var example = io.connect('http://localhost/example');당신의 자바 스크립트 클라이언트 와 클라이언트가 자동으로 네임 스페이스에 추가됩니다.

활용 예 :

  • 방 : 개인 채팅.
  • 네임 스페이스 : 페이지의 채팅.

2

룸과 네임 스페이스는 통신을 분할하고 개별 소켓을 그룹화합니다.

회의실 또는 네임 스페이스로의 브로드 캐스트는 구성원에게만 모든 사람에게 도달하지는 않습니다.

네임 스페이스와 룸의 차이점은 다음과 같습니다.

  • 네임 스페이스 : 프런트 엔드에서 관리됩니다. 즉, 사용자 또는 공격자가 프런트 엔드를 통해 참가하고 참가 및 연결 해제가 여기서 관리됩니다.
  • 회의실 : 백엔드에서 관리됩니다. 즉, 서버가 회의실에 참가하거나 탈퇴하는 것을 의미합니다.

차이점은 주로 누가 관리 하는가입니다

사용할 항목을 결정하려면 세그먼트를 프론트 엔드 또는 백엔드에서 관리해야하는지 결정해야합니다.


0

네임 스페이스를 사용하면 동일한 이름으로 객체를 만들 수 있지만 다른 네임 스페이스 (예 : 스코프)에 존재하므로 분리됩니다.

이것은 Socket.IO 네임 스페이스와 동일한 사고 과정입니다. 모듈 식 Node 웹 애플리케이션을 빌드하는 경우 다른 모듈의 네임 스페이스를 지정하려고합니다. 네임 스페이스 코드를 되돌아 보면 다른 네임 스페이스에서 동일한 정확한 이벤트를 수신 할 수 있음을 알 수 있습니다. Socket.IO에서 기본 연결의 연결 이벤트와 / xxx 네임 스페이스의 연결 이벤트는 다릅니다. 예를 들어 사이트에 채팅 및 댓글 시스템이 있고 둘 다 실시간으로하려면 각각 네임 스페이스를 지정할 수 있습니다. 이를 통해 자체 컨텍스트에만있는 전체 Socket.IO 응용 프로그램을 빌드 할 수 있습니다.

패키지 및 설치 대상을 구축하는 경우에도 마찬가지입니다. 누군가가 기본 네임 스페이스에서 특정 이벤트를 이미 사용 중인지 알 수 없으므로 자신 만의 이벤트를 작성하여 들어야합니다. 따라서 패키지를 사용하는 개발자의 발끝을 밟지 않아도됩니다.

네임 스페이스를 사용하면 서로 다른 컨텍스트로 연결을 만들 수 있습니다. 이를 룸과 비교하여 연결을 그룹화 할 수 있으며 동일한 룸을 다른 룸에 연결할 수도 있습니다.

네임 스페이스를 사용하면 Socket.IO가 작동 할 다른 컨텍스트를 만들 수 있습니다. 룸을 사용하면 해당 컨텍스트 내에서 클라이언트 연결을 그룹화 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.