피드로 돌아가기
Dev.toBackend
원문 읽기
상태 기반 데이터 모델링을 통한 실시간 통화 시스템의 안정성 확보
# I Got Burned by Socket Chaos. Here's How I Finally Built Real-Time Calls That Actually Work.
AI 요약
Context
단순 소켓 이벤트 기반의 통화 구현으로 인해 연결 끊김, 상태 불일치, 고스트 피어 발생 등의 심각한 런타임 버그가 발생함. 통화 상태를 데이터베이스가 아닌 메모리나 클라이언트 단의 임시 플래그로 관리하여 발생한 구조적 한계임.
Technical Solution
- 통화 단위를 단순 이벤트가 아닌 Participant 중심의 Session 모델로 재설계하여 데이터베이스를 Single Source of Truth로 설정
- Call Lifecycle(고위험/저빈도 변경)과 In-call State Sync(저위험/고빈도 변경) 모듈을 엄격히 분리하여 시스템 안정성 및 확장성 확보
- 통화 시작 시 Payload 정규화, 차단 여부 검증, DB 레코드 생성 후 Socket Ring 이벤트를 송신하는 순차적 신뢰 흐름 구축
- 모든 WebRTC Signaling 릴레이 시점에 DB 기반의 멤버십 검증을 강제하여 유효하지 않은 피어 간의 연결 시도를 원천 차단
- 참여자 상태(CONNECTED, INVITED, DECLINED) 기반의 동적 필터링을 통한 Fan-out 로직 구현으로 재접속 시 상태 동기화 문제 해결
- 마지막 활성 참여자 이탈 시에만 통화를 종료하는 Participant-aware 종료 로직을 통해 개별 연결 장애로 인한 전체 통화 단절 방지
실천 포인트
1. 통화 상태를 메모리 변수가 아닌 DB의 Participant Table 상태로 관리하고 있는가?
2. WebRTC 시그널링 전달 전, 송신자와 수신자의 멤버십 유효성을 매번 검증하는가?
3. Lifecycle 관리 로직과 실시간 데이터 동기화 로직이 물리적/논리적으로 분리되어 있는가?
4. 참여자 한 명의 접속 장애가 전체 세션 종료로 이어지지 않는 구조인가?