Skip to content

openvidu 세션 종료 메서드 오류

simjaesung edited this page Dec 1, 2024 · 1 revision

문제

image

설명

openvidu closeSession 함수가 발동되면 서버가 터져버리는 문제가 발생


해결 과정

11.21

전체 코드

async closeSession(roomId: string): Promise<void> {
    try {
      const session = this.sessions.get(roomId);
      if (!session) return;

      await session.fetch();
      const activeConnections = session.activeConnections;

      for (const connection of activeConnections) {
        try {
          await session.forceDisconnect(connection);
        } catch (error) {
          console.error(
            `Failed to disconnect connection ${connection.connectionId}: ${error.message}`,
          );
        }
      }
      await session.close();
      this.sessions.delete(roomId);
      console.log(`Session ${roomId} successfully closed and cleaned up`);
    } catch (error) {
      console.error(`Failed to close session: ${error.message}`);
      throw new OpenviduSessionCloseFailedException();
    }
  }

docker logs 조회하기

videoServer에서 forceDisconnect 에 대한 로그는 잘 남아있음

docker logs 993491b88a87 | grep "forceDisconnect"

image

크게 문제는 없어보임. 6명의 유저 수만큼 forceDisconnect가 일어났음


close 에대한 로그 검색도 같이해봄

docker logs 993491b88a87 | grep -E "forceDisconnect|close"

image

크게 문제는 없어보임. 6명의 유저 수만큼 close 일어났음

11.23

도커 개발환경을 구축하고 에서 해당 오류를 추적해보았습니다.

image

disconnect까지는 잘 이루어지는 것 같습니다. 실제로 6명의 연결자에 대한 정보를 closed 해주는 모습입니다.


await session.close() 에서 오류가 발생하는 것이 확실해졌고, 혹시 해당 세션에 대한 정보를 업데이트 해줘야하나싶어 close() 호출 전 fetch()를 호출해보았습니다.

image


하지만 여전히 같은 오류가 발생했습니다.

image


해결

disconnect 이후 등장하는 await session.close(), await session.fetch() 함수들을 지워주니 정상적으로 잘 게임이 마무리 되었습니다.

image

openvidu log에서도 클라이언트 측에서 연결을 종료했다는 것을 볼 수 있었습니다.

image

하지만 마음에 걸리는 것은 session 종료에 대한 기록을 찾을 수 없다는 것인데,

이 상황에 대해 2가지 가정을 해볼 수 있을 것 같습니다.

  1. "Garbage Collector가 세션 정리를 담당”

    • 하지만 Garbage Collector가 동작을 하면 아래와 같은 로그가 남는데, 이는 찾아볼 수 없었습니다.

      image

  2. "FE 코드의 disconnect() 와 서버 코드 forceDisconnect() 가 세션 종료를 트리거한다”

    • 현재 상황에서 가장 합당한 이유인 것 같습니다.
    • OpenVidu는 클라이언트 연결 종료(disconnect)를 감지하면 자동으로 세션 종료를 트리거한다고 이해하는 것입니다.
    • 근거
      • 로그에 나타난 RpcNotificationService 메시지로 연결 종료가 정상적으로 처리된 것을 확인할 수 있습니다.
      • 추가적인 close 호출 없이도 세션 정리가 이루어졌습니다.
        • 오히려 disconnect 이후 session에 대한 정보를 조회하면 바로 터져버렸습니다.
      • 로그에 명시적인 GC 언급을 볼 수 없었습니다. 평소에는 주기적으로 실행되는데 말이죠.

connection 종료는 FE에서 ? BE에서?

상단에 작성한 disconnect 은 BE코드의 forceDisconnect를 생각하고 작성한건데,

현재 FE 코드에서도 session.disconnect() 라는 함수가 실행되고 있습니다.

image

그래서 우선 게임 종료 시 forceDisconnect가 잘 동작하는지 확인하기 위해 하단 코드를 작성후 테스트 해봤습니다.

image


결과

image

결과적으로는 존재하는 유저들에 대해 forceDisconnect가 잘 동작했습니다.

직접적인 연결 종료는 BE 코드에서 끊어주는데, FE 코드의 disconnect는 어떻게 동작을 하는지 로그를 한번 확인을 해봐야할 것 같습니다.

그리고 제일 찜찜한건 세션 종료에 대한 로그가 남지않는다는 것입니다..


참고

[https://velog.io/@seongwop/Spring-OpenVidu-미디어-서버-세션-유지하기](https://velog.io/@seongwop/Spring-OpenVidu-%EB%AF%B8%EB%94%94%EC%96%B4-%EC%84%9C%EB%B2%84-%EC%84%B8%EC%85%98-%EC%9C%A0%EC%A7%80%ED%95%98%EA%B8%B0)

MafiaCamp

📔소개
🎯프로젝트 규칙
💻프로젝트 기획
🍀기술 스택
📚그룹 회고
🌈개발 일지
🍀문제 해결 경험
🔧트러블 슈팅
Clone this wiki locally