실시간 1:1 음성 통화 플랫폼(VoiceLink)에서 수백 명의 동시 접속자가 매칭 큐에 진입할 때 가장 치명적인 장애는 동일한 사용자가 서로 다른 2개의 통화 세션에 동시에 배정되는 이중 매칭(Double Booking) 경합 상태(Race Condition)입니다.
다중 분산 애플리케이션 인스턴스 환경에서 일반적인 ZRANGE 후 ZREM 방식의 2-Step 조회는 동시성 트래픽이 몰릴 때 두 인스턴스가 동일한 대기자를 읽어 각자 다른 상대와 매칭을 체결해 버리는 치명적인 데이터 정합성 결함을 유발합니다. VoiceLink에서는 Redis Single-Threaded Lua Script의 원자적 연산과 TTL Presence Key를 결합한 Stale 세션 능동 격리 아키텍처를 구축하여 동시성 경합 상황에서도 이중 매칭을 0건으로 완전 방어했습니다.
lazy loading이면 다 해결되나? 서론 JPA를 공부하며 연관관계를 설정할 때, 이런 생각이 들었다. “N+1 문제? 그냥 모든 연관관계 FetchType.LAZY로 걸어두면 되는 거 아닌가?” 그렇게 생각하고 엔티티마다 LAZY를 설정하고 테스트를 통과시켰다.…
대규모 데이터 파이프라인을 운영하다 보면 필연적으로 원천 로그 재수집이나 과거 데이터 재적재(Backfill) 상황을 마주하게 됩니다. 이때 가장 치명적인 문제는 재실행 시 중복 적재(Duplicate Insert)나 데이터 유실이 발생하는 것입니다. “Airflow DAG? 그냥 실패하면 웹 UI에서…
실시간 음성 매칭 서비스 VoiceLink를 구축할 때, 가장 까다로운 난제는 로컬 개발 환경과 실제 모바일 LTE/사내 방화벽 환경 간의 네트워크 도달률 차이였습니다. “WebRTC? 그냥 오픈소스 LiveKit 도커로 띄우고 클라이언트 SDK 연결하면 끝 아닌가?” 로컬…