life is egg

[나만무] 소켓 disconnect 가 두번씩 호출되는데... 본문

sw정글

[나만무] 소켓 disconnect 가 두번씩 호출되는데...

삶은계란진재혁 2024. 7. 23. 13:07

오류상황

 

프로메테우스와 그라파나를 이용해서 정확한 사용자수를 기록해보려고하는데

위에 사진에서 보이는 것처럼  파랑색라인이 나간유저이고 초록이가 현재 접속유저인데 기록이 이상하게 되고있는걸 알 수있다

누적 접속 유저는 3명이 max인데, 나간유저가 6명 즉 2배로 찍히고, 현재 접속유저가 음수를 기록하고 있다.. 뭔가 좀 더 원본 메트릭을 보자면..

 

이렇게 되어있는 걸 볼 수 있는데.. 확실히 뭔가 잘못된 코드가 존재한다..!

 

 

 

소켓 disconnect 메트릭을 수집하는 함수이다

user.disconnected 이벤트를 리슨하고있다

이 이벤트를 보내주는곳은..!

 

소켓 handleDisconnect 함수에서 

eventEmiiter로 emit 해주고있다

 

 

그렇다면 진짜로 소켓 하나당 handleDisconenct가 두번 호출 되었다는건데..

 

그렇게 해서 의심가는 부분을 찾다보니 발견한 곳 ..

 

 

통신 프로토콜을 udp로 변경하면서 소켓 disconnect 부분인 인식이 잘 안되어서 유저가 나가도 캐릭터가 유령처럼 남아있다가

 

간접적인 종료인 , 패킷을 주고받지 않고 대략 20초가 지나서야 사라져졌다.

 

그래서 대안으로 서버가 주기적으로 ping을 보내고

그 ping에대한 응답이 3번이상 없어지면 이제 백서버가 명시적으로 disconnect를 호출하는 방식으로 변경했는데 거기서 오류가 있다는 걸 발견했다

 

그때의 우리의 생각은 소켓연결을 종료하고 따로 channel.close 도 해줘야 한다는 생각이였기때문인데..

 

 

 

 

라이브러리를 까봤는데 의심가는 부분은 여기인데... 내가 아직 타입스크립트랑 자바스크립트를 잘 몰라서.. 이상은 추축이다..

 

여기서 DISCONNECT 이벤트를 보내주고 그걸 수신해서 한번더 호출이 되는게 아닐까..? 라는 생각

 

그래서 그 EVENTS 라는걸 까보고싶었는데 뭐.. 알 수있는 정보가 안나오니... 흠! 

 

결론

일단 그래서 두번 호출하는건 막았는데 정확히 뭐 때문에 channel.close를 하면 disconnect까지 호출되는지 원리를 파악하지는 못해서 아쉽다..

Comments