-
Notifications
You must be signed in to change notification settings - Fork 0
openvidu 세션 종료 메서드 오류
openvidu closeSession
함수가 발동되면 서버가 터져버리는 문제가 발생
전체 코드
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 993491b88a87 | grep "forceDisconnect"
크게 문제는 없어보임. 6명의 유저 수만큼 forceDisconnect
가 일어났음
docker logs 993491b88a87 | grep -E "forceDisconnect|close"
크게 문제는 없어보임. 6명의 유저 수만큼 close
일어났음
도커 개발환경을 구축하고 에서 해당 오류를 추적해보았습니다.
disconnect까지는 잘 이루어지는 것 같습니다. 실제로 6명의 연결자에 대한 정보를 closed 해주는 모습입니다.
await session.close()
에서 오류가 발생하는 것이 확실해졌고, 혹시 해당 세션에 대한 정보를 업데이트 해줘야하나싶어 close() 호출 전 fetch()를 호출해보았습니다.
하지만 여전히 같은 오류가 발생했습니다.
disconnect
이후 등장하는 await session.close()
, await session.fetch()
함수들을 지워주니 정상적으로 잘 게임이 마무리 되었습니다.
openvidu log에서도 클라이언트 측에서 연결을 종료했다는 것을 볼 수 있었습니다.
하지만 마음에 걸리는 것은 session 종료에 대한 기록을 찾을 수 없다는 것인데,
이 상황에 대해 2가지 가정을 해볼 수 있을 것 같습니다.
-
"Garbage Collector가 세션 정리를 담당”
-
하지만 Garbage Collector가 동작을 하면 아래와 같은 로그가 남는데, 이는 찾아볼 수 없었습니다.
-
-
"FE 코드의 disconnect() 와 서버 코드 forceDisconnect() 가 세션 종료를 트리거한다”
- 현재 상황에서 가장 합당한 이유인 것 같습니다.
- OpenVidu는 클라이언트 연결 종료(
disconnect
)를 감지하면 자동으로 세션 종료를 트리거한다고 이해하는 것입니다. -
근거
- 로그에 나타난
RpcNotificationService
메시지로 연결 종료가 정상적으로 처리된 것을 확인할 수 있습니다. - 추가적인
close
호출 없이도 세션 정리가 이루어졌습니다.- 오히려
disconnect
이후 session에 대한 정보를 조회하면 바로 터져버렸습니다.
- 오히려
- 로그에 명시적인 GC 언급을 볼 수 없었습니다. 평소에는 주기적으로 실행되는데 말이죠.
- 로그에 나타난
상단에 작성한 disconnect
은 BE코드의 forceDisconnect
를 생각하고 작성한건데,
현재 FE 코드에서도 session.disconnect()
라는 함수가 실행되고 있습니다.
그래서 우선 게임 종료 시 forceDisconnect
가 잘 동작하는지 확인하기 위해 하단 코드를 작성후 테스트 해봤습니다.
결과
결과적으로는 존재하는 유저들에 대해 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)
web12-MafiaCamp