84/99 Socket 중복 생성 트러블 슈팅

2022. 8. 1. 15:55항해99 일지

socket.io 그리고 namespace에 관하여

 

문제상황:

사이트 접속과 동시에 소켓이 생성된다. 문제는 disconnect되는 소켓없이 계속 불어나기만했다. 유저가 사이트를 나가기전까지는 계속 connect되기만 한다. 그리고 나가는 동시에 많게는 수십개의 socket이 끊어지는 상황이 생겼다.

이런 문제는 다른 room의 채팅이 보여지거나 두번 세번 중복되어 나오는 문제를 일으켰다. 

 

 전에 보고 지나쳤던 네임스페이스가 생각났는데 네임스페이스는 아래설명과 같다.

 

  • 네임스페이스란 Express의 라우팅처럼 url에 지정된 위치에 따라 신호의 처리를 다르게 하는 기술이다.

    서버와 클라이언트가 연결되면 실시간 데이터 공유가 가능한데, socket을 그냥 사용하면 데이터가 모든 socket으로 들어가게 된다.

    하지만 특정 페이지에서 소켓이 보내주는 모든 실시간 메세지를 모두 받을 필요는 없다. 불필요하며 낭비이기 때문이다.

    그래서 특정 노드끼리만 연결해주는 것이 namespace 이다.

 

지금까지는 기본 네임스페이스인 / 에 신호를 전송하고 수신했지만, 다른 네임스페이스를 만들어서 신호를 각기 독립적으로 처리할 수도 있는 것이다. 즉, 지정한 Namespace에 있는 소켓 끼리만 통신 한다는 개념이다.

이를 이용하여 채팅쪽 탭을 클릭했을때만 소켓을 연결하거나 끊어지도록해서 낭비를 줄이고 문제상황도 해결했다.

 

const chatspace = io.of("/chat");
chatspace.on("connection", (socket) => {
...
socket.on("disconnect", () => {
  });
});

이를 이용해서 섹션을 나눠 소켓으로 앞으로 다른 일들도 해볼 수 있을 것 같다. 

 

응답이 없는 Socket의 연결을 끊기 위해 아래 코드와 같이 설정하여 불필요하게 연결된 소켓의 낭비를 더 줄일 수 있었다.

const io = socketIo(http, {
  pingInterval: 10000,
  pingTimeout: 5000,
  ...
  }

 

 

이 문제에 대해서 생각하다가 문득 어느 영화가 떠올랐는데 인셉션이였다. 

내 머릿속에서는 connect된 상황에서 워크스페이스를 이동하거나 할때마다 다시 connect되는 상황이 꿈속의 꿈으로 또 들어가는 느낌이였다. 영화에서처럼 위에있던 꿈이 안쪽의 꿈에까지 영향을 미치는 그런 ? 상황이 생각났다.