Kakao i Connect Live 커뮤니티

브라우저 새로고침 및 강제 종료시 disconnect 지연되는 문제

리액트 + 커넥트라이브를 활용해서 웹 서비스를 개발하고 있습니다.

클린업에서 room.disconnect()를 해도 유저 정보가 남아 있는 현상이 발생합니다.

원래 disconnect되는데 지연이 걸리는 건가요?

안녕하세요.
브라우저 새로고침이나 기타 불특정 다수의 상황에서 연결이 끊어졌을때
일정시간 이후에 룸과 유저가 소멸됩니다.

정상적으로 종료 콜을 했을 경우에는 즉시 소멸됩니다.
하지만 간혹 sdk 내부에서 리소스 정리 및 세션 처리하는부분이 간혹 다소 시간이 걸릴 수 도있습니다.
이 부분은 실제 구동 환경에 따라서 차이 나는 부분이나 일반적인 경우 굉장히 짧습니다.

일반적으로 경우 굉장히 짧다고 하시는데 최대 20초가량 걸립니다…이렇게까지 걸리면 사실상 상용화하기 어렵지 않나 의구심이 드네요…ㅠ

일반적으로 굉장히 짧다고 전달드린 의미는
네트워크나 브라우저 기타 여러가지 조건이 국가별, 지역별로 상이하기 때문에 전달드린 내용입니다.

국내의 경우, 정상적으로 disconnect 콜을 하셨을 경우에는 그 즉시 유저가 소멸됩니다.

혹시 기능에 대한 사용 가이드나 예제 코드가 필요하시면 하기 페이지 참고 부탁드립니다.
https://sample.connectlive.kakaoi.ai/

해당하는 내용에 대해 더 자세한 안내가 필요하시면
작성하신 코드 스니펫과 함께 하기 정보 요청드립니다.

1.고객명 : ( 유료 고객의 경우만 )
2. 개발 환경 : 웹(크롬/사파리/기타), 모바일(안드로이드/iOS)
3. SDK 버전 :
4. 서비스 ID :

예제는 모두 확인했습니다. 하지만 브라우저 새로고침 혹은 사용자가 사용하면서 개발자가 의도한 바와 다르게 룸에서 이탈한 경우를 대비해서 useEffect 클린업에서 room.disconnect() 를 호출하여도 정상적으로 룸에서 유저가 삭제되지 않습니다. 이럴 경우 나간 유저 외의 다른 유저가 진입시 비정상적으로 나간 유저가 남아있는 현상이 발생합니다. 이를 보완하기 위해서 별도의 socket서버를 구축해서 사용하고 있는데, 비효율적이라고 판단이 돼서요. 카카오에서는 어떤 식으로 처리하고 있는지 궁금하네요

결론부터 말씀드리자면 관련해서 의도적으로 처리한 결과가 지금 현 상태라고 이해해주시면 될 것 같습니다.

Kakao i Connect LIve (이하 iCL)은 기본적으로 서비스 환경 자체를 열악한 상태에서도 통신이 가능하게 하는 것을 목표로 만들어졌습니다.
열악하다고 함은 지하철 안 혹은 전파가 매우 약한 환경 등 중간중간 네트워크가 끊어질 수 있는 환경을 말합니다. 예를 들어 화상회의 중에 클라이언트와 서버 간의 연결이 끊겼을 경우 이를 바로 종료시키게 되면 네트워크가 열악한 상황에서는 매번 회의 퇴장과 입장을 반복하게 되는 매우 부정적인 고객 경험을 초래할 것입니다.
따라서 저희 쪽에서는 비록 클라이언트와의 통신이 끊기더라도 일정 간의 유예를 두어 그 안에 같은 정보로 접속할 경우 기존 상태를 그대로 끊어짐 없이 연결 상태를 유지하도록 하여 보다 안정적인 고객 경험을 제공하고 있습니다.

물론 이는 정상적으로 disconnect 콜을 했을 경우가 아닌, 새로 고침, 인터넷 연결 불가 등 disconnect 콜이 없이 연결이 끊어지는 상황을 말합니다.

그리고 말씀해주신 내용을 바탕으로 시나리오를 추측해봤을 때 다음과 같은 상황으로 이해하였습니다.

functional react에서 useEffect cleanup을 이용해 브라우저 새로고침시에 disconnect 콜을 하고자 의도

결론적으로 말씀드리면 react의 cleanup 함수는 컴포넌트가 해제될 때 트리거되는 조건이지 브라우저 새로 고침과 같은 상황에서는 정상적으로 작동하지 않습니다. 이유는 간단하게도 useEffect 라는 react side-effect자체는 js 프레임워크 레벨이기에 브라우저 새로고침과 같은 패키지 자체가 초기화되는 환경에서는 함수 트리거 조차 안정적으로 진행되지 않기 때문입니다.

이는 기본 내장 함수를 사용하더라도 안정성이 확보되지 않습니다. window 의 unload, beforeunload 를 사용하시더라도 브라우저 새로고침시에는 완벽한 보장이 되지 않습니다.

정리하자면 위 시나리오대로 하더라도 사용자가 남아있는 상황은 disconnect 콜이 정상적으로 이루어지지 않았기 때문입니다.

기본적으로 연결 종료는 종료 api 콜외에는 미디어 서버의 타이머에 의존적입니다. 이 타이머의 간격을 변화시켜 대응할 수 있으나 이는 iCL이 추구하는 방향성과 다르기 때문에 서비스로 제공하고 있지 않습니다.

해당하는 내용은 어플리케이션 레벨에서 자체적인 방법으로 해결하시는 것으로 안내해 드리고 있으며 특정 방법 등을 권장하거나 보장하지는 않습니다. 이 부분은 양해 부탁드립니다.

그렇다면 다시 궁금한 점이 있습니다. 화상회의 중에 클라이언트와 서버 간의 연결이 잠시 끊겼다가 다시 연결이 된 경우 room에 입장시 유저의 id 정보가 기존과 동일하게 뜨나요?

네 맞습니다

그렇군요 답변감사합니다!