#Backend

비하인드 스토리: 라이브 스트리밍을 위한 넷플릭스 광고 이벤트 파이프라인의 진화 — 2부

비하인드 스토리: 라이브 스트리밍을 위한 넷플릭스 광고 이벤트 파이프라인의 진화 — 2부
01

Summary

1억 명이 동시에 보는 라이브 스트리밍 광고, 넷플릭스는 어떻게 DB 병목 없이 실시간 처리했을까?

광고 서빙의 크리티컬 패스에서 DB를 제거하고 Apache Flink 실시간 스트리밍 조인으로 진화한 넷플릭스의 대규모 이벤트 파이프라인 구축기

넷플릭스가 라이브 스포츠 및 대형 생중계 이벤트 트래픽 폭증에 대응하기 위해 광고 이벤트 파이프라인을 완전히 재설계한 과정을 다룹니다. 기존 동기식 DB 저장 방식을 폐기하고 Apache Flink 기반의 실시간 스트리밍 조인(Streaming Join)을 도입함으로써, 광고 서빙 성능 저하 없이 대규모 트래픽을 유연하게 처리할 수 있게 된 기술적 성과를 공유합니다.

  • 01DB 쓰기 작업을 제거하여 광고 서빙 경로(Critical Path)의 단일 실패점(SPOF) 완벽 차단
  • 02Apache Flink 커스텀 연산자(KeyedCoProcessFunction)를 활용한 60분 윈도우 기반 실시간 스트림 조인 구현
  • 03다중 지역(Cross-region) 트래픽 발생 시 고비용 데이터 복제 대신 클라이언트 이벤트를 동적 재라우팅하는 효율적 설계
  • 04실시간 처리 한계를 보완하기 위한 Maestro 및 Spark 기반 지연 이벤트(Long-tail) 오프라인 복구 파이프라인 구축
  • 05점진적 키 기반 트래픽 전환과 99.99% 이상 검증을 통해 다운타임 없는 레거시 시스템 완벽 철거

RECOMMENDATION

대규모 실시간 트래픽 환경에서 DB 병목 해결이나 서비스 간 동기 의존성 제거를 고민 중인 백엔드 및 데이터 엔지니어에게 적극 추천합니다.

The Problem

기존 넷플릭스의 광고 데이터 보강(Enrichment) 구조는 광고 서버가 데이터베이스(Metadata Registry)에 동기적으로 쓰기 작업을 수행한 후, 이벤트 발생 시 이를 조회하는 방식이었습니다. 이 구조는 스포츠 생중계와 같이 수천만 명의 동시 접속자가 몰리는 라이브 스트리밍 상황에서 광고 서빙의 크리티컬 패스(Critical Path)에 병목을 일으키고 전체 시스템 안정성을 저해하는 원인이 되었습니다.

The Solution

넷플릭스는 중앙화된 키-값 데이터베이스 기반 조회를 제거하고 Apache Flink 기반의 상태 유지 스트림 처리(Stateful Stream Processing) 아키텍처로 파이프라인을 재설계했습니다. 광고 서빙 응답 로그와 클라이언트 이벤트를 Kafka 스트림으로 받아 60분 간격의 KeyedCoProcessFunction을 이용해 실시간 스트리밍 조인을 수행하며, 60분 초과 이벤트를 위해 Spark/Maestro 기반 배치 복구 경로를 구축했습니다.

The Result

광고 서빙의 핵심 경로에서 데이터베이스 쓰기 의존성을 완전히 제거하여 장애 위험 요소를 단일화하고 시스템 확장성을 크게 개선했습니다. 기존 시스템과의 섀도우 비교 테스트를 통해 99.99% 이상의 데이터 일치성을 검증한 후 레거시 레지스트리와 서비스를 안정적으로 데포하여 마이그레이션을 완료했습니다.

Trade-off

메모리 기반 상태 보존 기간을 60분으로 제한함에 따라 60분을 초과해 도착하는 극소수(약 0.001%) 지연 이벤트는 실시간 처리에서 제외되며, Spark 배치 작업을 통한 지연 복구 레이어에 의존해야 하는 한계가 존재합니다.

03

Key Concepts

Concept · 01

Streaming Join

두 개 이상의 실시간 데이터 스트림에서 공통 키를 기준으로 이벤트를 실시간 결합하는 스트림 처리 기법입니다. 데이터베이스 저장 절차 없이 메모리 내에서 즉시 데이터를 보강할 수 있어 저지연 처리에 유용합니다.

  • Kafka에 전송된 광고 서빙 응답 스트림과 클라이언트 이벤트 스트림을 impression ID 키로 실시간 매칭하는 데 활용되었습니다.
Concept · 02

KeyedCoProcessFunction

Apache Flink에서 두 개의 서로 다른 키 기반 스트림을 동시에 처리하고 상태(State)와 타임머를 직접 제어할 수 있게 해주는 최하위 레벨의 상태 유발 연산자입니다.

  • 60분 윈도우 동안 서빙 응답과 클라이언트 이벤트를 보관하고 매칭을 직접 제어하는 커스텀 조인 로직 구현에 적용되었습니다.
Concept · 03

At-Least-Once with Best-Effort Deduplication

이벤트를 최소 한 번 이상 전달함을 보장하되 메모리 내 최선의 중복 제거를 병행하고, 정밀한 카운팅이 필요한 최하류 시스템에서 최종 중복을 처리하게 하는 분산 시스템 설계 방식입니다.

  • Flink 내부 state와 이벤트 고유 Hash ID를 통해 실시간 중복을 제거하고 billing 연산 시스템으로 안전하게 데이터를 전달합니다.