오늘 하루 동안 웹소켓을 활용한 마피아 게임에서 몇 가지 주요한 문제가 발생했다.
클라이언트의 재접속 시 기존 세션 유지 문제
이벤트 브로드캐스팅 지연
소켓 연결이 끊긴 유저 처리
disconnect
이벤트가 늦게 감지되거나 아예 호출되지 않는 경우가 있었음. 기존 세션 유지 문제 해결
socket.handshake
를 활용하여 기존의 userId
를 저장하고, 재접속 시 기존 세션을 찾도록 변경.
Redis를 사용하여 유저의 연결 상태를 관리하고, 재접속 시 기존 정보를 불러오도록 수정.
브로드캐스팅 지연 문제 해결
socket.emit
을 활용하는 방식 대신 io.to(roomId).emit()
을 사용하여 특정 방에 있는 모든 클라이언트가 동일한 타이밍에 받을 수 있도록 수정.
네트워크 지연을 의심하여 WebSocket 패킷 로깅을 추가하여 문제를 추적.
소켓 연결 해제 감지 개선
disconnecting
이벤트를 활용하여 클라이언트의 연결이 해제되기 직전에 유저 상태를 업데이트하도록 변경.
pingTimeout
을 줄여서 네트워크가 끊어진 유저를 더 빠르게 감지하도록 설정.
세션 유지는 웹소켓 기반의 실시간 애플리케이션에서 필수적인 기능이다. Redis 같은 외부 저장소를 활용하면 더 안정적으로 관리할 수 있다.
브로드캐스팅은 단순한 emit이 아니라 네트워크 지연을 고려해야 한다. 로깅을 적극 활용하여 실시간 이벤트가 정확하게 전달되는지 확인하는 것이 중요하다.
유저의 연결 종료를 감지하는 방법은 여러 가지가 있다. disconnecting
을 활용하는 것이 더 빠르고 정확할 수도 있다.
내일 할 일: