피드로 돌아가기
How I Fixed a Race Condition in rrweb That Was Breaking 60% of My Session Recordings
Dev.toDev.to
Frontend

Race Condition 해결을 통한 세션 녹화 성공률 60% 개선

How I Fixed a Race Condition in rrweb That Was Breaking 60% of My Session Recordings

latifa ouali2026년 5월 17일4intermediate

Context

rrweb 라이브러리를 Dynamic Lazy Loading 방식으로 도입하여 초기 DOM 캡처 시점의 Race Condition 발생. 비동기 경로 확인 작업 완료 후 스크립트를 로드하는 구조로 인해, 초기 Full Snapshot(Type 4 event) 생성 시점을 놓치는 설계 결함 존재.

Technical Solution

  • Tracker 스크립트 초기화 즉시 rrweb 라이브러리를 Preload 하는 구조로 변경
  • IIFE 최상단에 script 태그를 즉시 삽입하여 네트워크 다운로드와 비동기 로직을 병렬 처리
  • loadRRWeb 함수 내 기존 로드 중인 스크립트의 load 이벤트를 대기하는 Promise 기반 동기화 로직 구현
  • 중복 스크립트 주입 방지를 위한 DOM querySelector 기반의 기존 스크립트 존재 여부 검증 단계 추가
  • Backend Merge 로직에서 단순 덮어쓰기 방식을 Math.max 기반의 최대값 유지 방식으로 변경하여 세션 지속시간 데이터 무결성 확보

Impact

  • 세션 녹화 실패율 60% 감소 및 초기 Snapshot 캡처 성공률 확보
  • 세션 지속시간(Duration) 측정 오차 해결을 통한 데이터 정확도 향상

Key Takeaway

초기 상태 캡처가 필수적인 라이브러리는 Lazy Loading 시 네트워크 지연에 따른 데이터 유실 위험이 크므로, 실행 시점과 로드 시점을 분리한 Preload 전략이 필수적임.


- 초기 DOM 상태가 중요한 라이브러리는 비동기 로직 실행 전 Preload 수행 - 외부 라이브러리 도입 시 최신 버전(latest) 대신 특정 버전 핀 고정(Version Pinning) 적용 - 분산 도착하는 배치 데이터 병합 시 단순 덮어쓰기가 아닌 집계 함수(Max, Sum 등) 사용 검토

원문 읽기