LiveKit 웹훅과 Redis를 연동한 실시간 통화 품질 모니터링 아키텍처 구축

1. 문제

실시간 음성 서비스인 Voice-Link에서 WebRTC 기반 통화가 끊기거나 품질이 저하될 때, 원인을 실시간으로 파악하고 관측하는 것은 매우 어렵습니다.
사용자가 통화 중 비정상적인 종료를 겪어도, 클라이언트 레벨의 끊김 이벤트만으로는 미디어 서버(LiveKit)와 백엔드 세션 간의 상태 불일치를 동기화하기 어렵습니다.
특히 복잡한 NAT 환경이나 모바일 네트워크 전환 과정에서 발생하는 패킷 손실(Packet Loss) 및 RTT 지연은 데이터베이스에 즉각 기록되지 않아 사후 품질 진단이 불가능해집니다.

2. 왜 필요한가

통화 상태 변화와 품질 데이터를 실시간으로 수집하고 영속화하기 위해 LiveKit 웹훅(Webhook) 처리기와 고성능 캐시인 Redis의 연동이 필수적입니다.
`LiveKitWebhookService`를 통해 `participant_disconnected`나 `participant_left` 같은 이벤트를 수신하면 세션 종료를 백엔드에 실시간 전파할 수 있습니다.
이와 동시에 `CallQualityService`가 주기적으로 수집하는 퀄리티 스냅샷을 Redis 리스트에 적재함으로써 대량의 네트워크 품질 타임라인을 디스크 I/O 병목 없이 메모리상에 trim하며 관리할 수 있습니다.

3. 기대효과

품질 모니터링을 실시간화함으로써 통화 품질 저하에 따른 사용자 이탈 요인을 선제적으로 분석하고 조치할 수 있습니다.
Redis에 저장된 RTT 및 Jitter 타임라인을 기반으로 통화 종료 시점에 즉각 진단 리포트를 생성하므로 고객 서비스 문의에 정량적 지표로 대응이 가능합니다.
또한 SSE(Server-Sent Events) 스트리밍 채널인 `CallEventStreamingService`와 연동하여 관리자 대시보드에서 장애 통화를 실시간으로 모니터링할 수 있습니다.

4. 구현 방향

LiveKit 웹훅 이벤트를 수신하여 세션 이벤트를 감지하고, 해당 통화 세션의 Redis 품질 데이터를 수집하여 최종 리포트를 빌드하는 이벤트 핸들러를 구축합니다.
Spring Boot 설정 파일(`application.yml`)에 정의된 `livekit.api-url` 및 Redis 접속 환경 정보를 기반으로 동작합니다.
아래 코드 예시처럼 웹훅 서비스에서 종료 이벤트를 감지하면 품질 리포트 저장소와 SSE 스트리밍으로 이벤트를 전파하도록 구현합니다.


@Service
public class LiveKitWebhookService {
    private final CallQualityService callQualityService;
    private final CallEventStreamingService eventStreamingService;

    public void handleWebhook(WebhookEvent event) {
        if ("participant_disconnected".equals(event.getEvent())) {
            String roomId = event.getRoom().getName();
            String userId = event.getParticipant().getIdentity();
            callQualityService.saveFinalQualityReport(roomId, userId);
            eventStreamingService.sendEvent(roomId, "disconnected");
        }
    }
}

5. 비즈니스 가치

정밀한 통화 품질 데이터 관측성은 Voice-Link 서비스의 통화 성공률을 높이고 운영 비용을 절감하는 비즈니스 자산이 됩니다.
통화 연결 실패 및 장애 발생률이 정량적으로 계측되므로 인프라(TURN/TLS 및 coturn) 튜닝 결과의 비포/애프터를 명확히 증명할 수 있습니다.
이는 궁극적으로 비대면 통화 플랫폼의 핵심 신뢰도를 구축하여 엔터프라이즈 고객사 유치 시 강력한 기술적 우위 요소로 작동합니다.

댓글 남기기