socket.io 방 또는 네임스페이스?
실시간 채팅을 위해 nodejs/socket.io 을 조사하고 있는데, 방 구현에 대한 조언이 필요합니다.
네임스페이스를 사용하는 것과 룸 기능을 사용하여 채팅을 서로 완전히 격리하는 것 중 어느 것이 더 낫습니까?
룸과 네임스페이스 사이의 실질적인 기술적 차이는 무엇입니까?
리소스 사용에 차이가 있습니까?
이름 공간과 강의실의 공통점은 다음과 같습니다(socket.io v0.9.8 - v1.0은 완전히 다시 쓰기 작업을 수행하므로 변경되었을 수 있습니다).
- 서버 측에 네임스페이스(io.of('/nsp'))와 룸(socket.join('room'))이 모두 생성됩니다.
- 여러 네임스페이스와 여러 룸이 동일한(WebSocket) 연결을 공유합니다.
- 서버는 단순히 클라이언트 측 필터링이 아닌 ansp/room에 연결/가입한 클라이언트에만 유선으로 메시지를 전송합니다.
차이점:
- 클라이언트가 다음을 사용하여 네임스페이스를 연결합니다.
io.connect(urlAndNsp)
- 강의실은 서버 측에서만 참여할 수 있습니다(단, 클라이언트가 참여할 수 있도록 서버 측에서 API를 만드는 것은 간단하지만).
- 네임스페이스를 인증 보호할 수 있습니다.
- 룸에서는 인증을 사용할 수 없지만, 룸 사용에 열중할 경우 서버에서 앞서 언급한 생성하기 쉬운 API에 사용자 지정 인증을 추가할 수 있습니다.
- 강의실은 네임스페이스의 일부입니다(기본값은 '글로벌' 네임스페이스).
- 네임스페이스는 항상 글로벌 범위에 뿌리를 둡니다.
개념과 이름(룸 또는 네임스페이스)을 혼동하지 않도록 구분을 사용하여 개념을 참조하고 다른 두 이름을 사용하여 개념을 구현합니다.그래서 만약 당신이
- 구획당 인증이 필요합니다. 네임스페이스가 가장 쉬운 경로일 수 있습니다.
- 계층적으로 계층화된 구획(최대 2개 층)을 원하는 경우 네임스페이스/룸 콤보 사용
- 클라이언트측 앱이 서로 분리해야 하는 여러 부분으로 구성되어 있는 경우(칸에 상관없이) 네임스페이스를 사용합니다.
후자의 예로는 각각 socket.io 를 독립적으로 사용하는 서로 다른 모듈(예: 타사)이 동일한 앱에서 사용되고 단일 네트워크 연결을 공유하려는 대규모 클라이언트 앱이 있습니다.
실제로 이것을 벤치마킹하지는 않았지만, 당신의 프로젝트에서 메시지를 분리하고 그룹화하기 위해 단순한 구획이 필요하다면 어느 것이든 괜찮습니다.
그것이 당신의 질문에 대한 답인지는 확실하지 않지만, 이 답에 이르는 연구는 적어도 제가 더 명확하게 보는 데 도움이 되었습니다.
오래된 질문이지만 주제에 대한 조사를 해보니 중요한 점에서 받아들여진 답이 명확하지 않습니다.Guillermo Rauch 자신(링크 참조)에 따르면, 실행 중인 앱에서 동적으로 네임스페이스를 생성하는 것은 이론적으로 가능하지만 주로 애플리케이션의 사전 정의된 별도 섹션으로 사용합니다.반면에 사용자/연결 그룹을 수용하기 위해 임시 구획을 즉시 작성해야 하는 경우에는 룸을 사용하는 것이 가장 좋습니다.
당신이 무엇을 하고 싶은지에 달려 있습니다.
가장 큰 차이점은 객실이 구현하기 어렵다는 것입니다.각 페이지를 다시 로드할 때 룸에 가입하는 방법을 만들어야 합니다.
이름 공간을 사용하여 쓰기만 하면 됩니다.var example = io.connect('http://localhost/example');
Javascript 클라이언트와 클라이언트는 자동으로 네임스페이스에 추가됩니다.
활용도의 예:
- 룸: 개인 채팅.
- 네임스페이스: 페이지의 채팅입니다.
룸 및 네임스페이스는 통신을 분할하고 개별 소켓을 그룹화합니다.
룸 또는 네임스페이스에 대한 브로드캐스트는 구성원만 모든 사용자에게 전달되지 않습니다.
네임스페이스와 룸의 차이점은 다음과 같습니다.
- 네임스페이스:는 프론트엔드에서 관리됩니다. 즉, 사용자 또는 공격자가 프론트엔드를 통해 가입하고 가입 및 연결 해제가 여기서 관리됩니다.
- 회의실: 백엔드에서 관리됩니다. 즉, 서버가 회의실에 참석 및 퇴장을 할당합니다.
차이점은 주로 누가 관리하느냐에 있습니다.
사용할 항목을 결정하려면 분할을 프런트엔드에서 관리할지 백엔드에서 관리할지 결정해야 합니다.
네임스페이스를 사용하면 동일한 이름을 가진 개체를 만들 수 있지만 서로 다른 네임스페이스(범위라고도 함)에 살기 때문에 개체는 별도입니다.
이것은 소켓과 동일한 사고 과정입니다.IO 네임스페이스입니다.모듈식 노드 웹 응용프로그램을 작성하는 경우 다른 모듈의 네임스페이스를 사용할 수 있습니다.네임스페이스 코드를 다시 보면 서로 다른 네임스페이스에서 동일한 이벤트를 정확하게 수신할 수 있었습니다.소켓에 있습니다.IO, /xx 네임스페이스의 기본 연결 및 연결 이벤트의 연결 이벤트가 다릅니다.예를 들어, 사이트에 채팅 및 댓글 시스템이 있고 둘 다 실시간으로 하려면 각각의 네임스페이스를 지정할 수 있습니다.이렇게 하면 전체 소켓을 구축할 수 있습니다.고유한 컨텍스트에서만 작동하는 IO 애플리케이션.
패키지화 및 설치할 무언가를 구축하는 경우에도 마찬가지입니다.다른 사용자가 이미 기본 네임스페이스에서 특정 이벤트를 사용하고 있는지 여부를 알 수 없으므로 자신의 이벤트를 만들고 여기서 청취해야 합니다.이를 통해 패키지를 사용하는 개발자에게 구애받지 않을 수 있습니다.
네임스페이스를 사용하면 연결을 다른 컨텍스트로 분할할 수 있습니다.우리는 이것을 방과 비교할 수 있는데, 이것은 우리가 연결을 그룹화할 수 있게 해줍니다.그러면 우리는 같은 연결을 다른 방에도 연결할 수 있습니다.
네임스페이스를 사용하면 소켓에 대한 다른 컨텍스트를 만들 수 있습니다.작업할 IO.룸을 사용하여 컨텍스트 내에서 클라이언트 연결을 그룹화할 수 있습니다.
네임스페이스 내에 룸이 있을 수 있으므로 코드를 구성하는 데 도움이 되지만 룸 내부에는 네임스페이스가 있을 수 없습니다.네임스페이스는 최상위 세그먼트화이고 룸은 하위 세그먼트화입니다.
TL/DR
Socket.io 의 네임스페이스와 룸은 모두 매우 유사하며, 가장 큰 차이점은 다음과 같습니다.
- 네임스페이스 내부에 룸이 있습니다.
- 서버에 작성된 네임스페이스는 클라이언트에서 결합됩니다.
- 반면에 객실은 순전히 서버 측이며 고객은 객실에 대해 알지 못합니다.
어떤 것을 사용할지는 순전히 여러분이 만들고자 하는 것에 기반을 두고 있습니다.
이 도움이 되는 게시물에서 더 자세한 내용을 알아보겠습니다.
네임스페이스
Socket.IO를 사용하면 소켓에 네임스페이스를 지정할 수 있으며, 이는 기본적으로 서로 다른 끝점 또는 경로를 할당하는 것을 의미합니다.
이 기능은 다음에 유용합니다.리소스 수(TCP 연결)를 최소화하는 동시에 통신 채널 간의 분리를 도입합니다.
서버 측에 네임스페이스가 작성됩니다. 그러나 서버에 요청을 전송하여 클라이언트에 의해 가입됩니다. (EX:io.connect('/namespace')
)
객실
강의실은 네임스페이스의 하위 채널입니다.강의실은 순전히 서버 측 구성이며 고객은 강의실에 대해 아무것도 알지 못합니다.
당신은 클라이언트 쪽에서 socketio가 있는 룸에 가입할 수 없습니다, 서버 쪽에서 해야 합니다.이 문제를 해결하려면 당신이 가입하고자 하는 방을 데이터로 사용하는 소켓을 내보내야 하며, 서버에서 당신은 이 소켓을 듣고 socket.join()을 전송된 방의 이름이나 ID로 호출합니다.
언급URL : https://stackoverflow.com/questions/10930286/socket-io-rooms-or-namespacing
'source' 카테고리의 다른 글
C - 문자열을 문자열 배열로 분할 (0) | 2023.07.30 |
---|---|
Axios API에서 데이터를 반환하는 중 (0) | 2023.07.30 |
MSSQL 증분 정수 열이 있는 문 선택...일반적이지 않은 (0) | 2023.07.30 |
차체에 새 필드 추가 예외 스프링 받침대 (0) | 2023.07.30 |
히스토그램 산점도 행렬 lib (0) | 2023.07.25 |