티스토리 뷰

728x90

실시간 게임 듀오 매칭 서비스 겜구에서 소켓 부분은 nodejs 의 socket.io 라이브러리를 활용해서 개발했습니다. 

어느날부터 계속해서 소켓 서버가 죽는 문제가 발생했습니다...

로그를 살펴보니, 매칭 객체를 제대로 초기화하지 않아서 생긴 문제였습니다. 

 

1. socket.data.matching 객체  초기화 문제

기존에는 socket.data.matching=null으로 초기화했습니다. 

이렇게 했더니 NullPointException이 발생해서.. 다음과 같이 resetMatchingObject 메서드를 만들어서 초기화를 진행했습니다.

function resetMatchingObject(socket) {
    socket.data.matching = {
        gameMode: null,
        roomName: null,
        myMatchingInfo: null,
        matchingUuid: null,
        priorityTree: new PriorityTree(),
        highestPriorityNode: null
    };
}

 

그런데도 계속해서 서버가 죽는 에러가 또 발생했습니다. 

다시 소켓 서버 로그를 살펴보았습니다..

 

2. import 오류

예외는 다음 세 가지에서 발생했습니다.

1. matching-fail 

2. matching-not-found

3. matching-quit

해당 이벤트들의 공통점이라면, deleteMySocketFromMatching 메서드를 불러온다는 점입니다.

즉, 만들었던 resetMAtchingObject()에서 동일한 에러가 계속 발생했습니다.

로그에서는 PriorityTree가 스코프에 존재하지 않는 상태에서 resetMatchingObject()가 새 트리를 만들거나 초기화하려다가 예외가 발생하는 것이었습니다. 따라서, 이 예외(uncaughtException)를 처리하려다가 프로세스가 다운되는 것이었습니다.

 

다시 코드를 살펴보니 new Priority를 실행시키기 위한 라이브러리를 불러오지 않은 것이 문제였습니다.

 

3. 초기화 시점

matching reject, fail, quit 할 때 필요해서

매칭 객체를 matching-found 된 시점에서 초기화하면 안됨

resetMatchingObject 호출 위치 수정

4. matching-quit 

매칭 다시하기 중에서 matching-quit 이벤트가 발생하면 제대로 처리가 안됨..

소켓은 살아있어서 matching-success-receiver가 오면 matching-success-sender가 발생하기 때문

지금 status를 FOUND일 때만 SUCCESS로 변경하게해서 매칭 성공이 되는 오류가 발생하지는 않지만, 

matching-quit할 때 상태 소켓이 있다면, matching-fail을 보내주는 로직이 필요함

 

728x90
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/12   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함