2025년 2월 21일

김동환·5일 전
0

TIL (Today I Learned) - 2025년 2월 21일

오늘의 문제: 웹소켓을 활용한 마피아 게임에서 발생한 이슈

1️⃣ 문제 상황

오늘 하루 동안 웹소켓을 활용한 마피아 게임에서 몇 가지 주요한 문제가 발생했다.

  1. 클라이언트의 재접속 시 기존 세션 유지 문제

    • 유저가 게임 중 웹소켓 연결이 끊겼을 때 다시 접속하면 새로운 세션이 생성됨.
    • 기존의 유저 정보를 유지해야 하는데, 중복 세션이 생성되면서 게임 로직이 꼬이는 문제가 발생.
  2. 이벤트 브로드캐스팅 지연

    • 서버에서 특정 이벤트(예: 투표 시작, 밤낮 전환 등)를 브로드캐스팅했을 때 일부 클라이언트가 늦게 받거나 받지 못하는 현상 발생.
    • 특히, 특정 유저가 비정상적으로 이벤트를 받지 못하는 경우가 있어 디버깅이 필요했음.
  3. 소켓 연결이 끊긴 유저 처리

    • 유저가 게임 도중 접속을 종료하면 해당 유저를 자동으로 처리해야 하는데, 예상과 다르게 상태가 즉시 반영되지 않음.
    • disconnect 이벤트가 늦게 감지되거나 아예 호출되지 않는 경우가 있었음.

2️⃣ 문제 해결 과정 및 시도한 방법

기존 세션 유지 문제 해결

  • socket.handshake를 활용하여 기존의 userId를 저장하고, 재접속 시 기존 세션을 찾도록 변경.

  • Redis를 사용하여 유저의 연결 상태를 관리하고, 재접속 시 기존 정보를 불러오도록 수정.

    브로드캐스팅 지연 문제 해결

  • socket.emit을 활용하는 방식 대신 io.to(roomId).emit()을 사용하여 특정 방에 있는 모든 클라이언트가 동일한 타이밍에 받을 수 있도록 수정.

  • 네트워크 지연을 의심하여 WebSocket 패킷 로깅을 추가하여 문제를 추적.

    소켓 연결 해제 감지 개선

  • disconnecting 이벤트를 활용하여 클라이언트의 연결이 해제되기 직전에 유저 상태를 업데이트하도록 변경.

  • pingTimeout을 줄여서 네트워크가 끊어진 유저를 더 빠르게 감지하도록 설정.


3️⃣ 오늘의 교훈 & 다음 개선할 점

세션 유지는 웹소켓 기반의 실시간 애플리케이션에서 필수적인 기능이다. Redis 같은 외부 저장소를 활용하면 더 안정적으로 관리할 수 있다.

브로드캐스팅은 단순한 emit이 아니라 네트워크 지연을 고려해야 한다. 로깅을 적극 활용하여 실시간 이벤트가 정확하게 전달되는지 확인하는 것이 중요하다.

유저의 연결 종료를 감지하는 방법은 여러 가지가 있다. disconnecting을 활용하는 것이 더 빠르고 정확할 수도 있다.

내일 할 일:

  • Redis를 활용한 유저 상태 관리 최적화
  • 웹소켓 이벤트 로깅 시스템 강화
  • 네트워크 지연 테스트 및 최적화
profile
Node.js 7기

0개의 댓글

관련 채용 정보