Netflix/data-pipelines

3 개의 포스트

netflix4분 읽기큐레이션 요약

데이터 카나리아: 넷플릭스는 카탈로그 메타데이터를 어떻게 검증하는가

넷플릭스는 코드 변경이 없어도 카탈로그 데이터 자체가 손상되면 수백만 명의 재생 경험이 즉시 영향을 받을 수 있다는 점을 확인했다. 이에 실제 운영 트래픽으로 새 데이터 버전을 검증하는 데이터 카나리 시스템을 구축했고, 10분 이내에 문제를 감지해 배포를 차단한다. 핵심은 최종 변환 결과를 별도 카나리 클러스터에서 검증하고, 실제 재생 시도량을 기준으로 이상 여부를 빠르게 판단하는 것이다. ## 카탈로그 메타데이터 손상으로 발생한 장애 - 넷플릭스의 카탈로그 메타데이터는 타이틀, artwork, 제공 지역, 재생 가능 여부 등을 정의한다. - 과거 장애 대응 과정에서 실행된 수동 완화 조치가 데이터 피드를 비워 버렸고, 일부 타이틀의 메타데이터가 손상됐다. - 코드나 설정 변경이 없었기 때문에 기존 코드 카나리 배포는 문제를 감지하지 못했다. - 손상된 메타데이터로 manifest 생성이 실패하면서 카탈로그 서비스와 재생 기능에 장애가 발생했다. - 각 upstream 데이터 소스에는 검증 로직이 있었지만, 여러 입력을 변환한 최종 출력 상태의 오류까지는 잡지 못했다. ## 데이터 배포에 필요한 새로운 검증 방식 - 카탈로그 데이터는 여러 입력 피드를 지속적으로 변환하고 짧은 주기로 배포하는 고속 데이터 파이프라인이다. - 기존 카나리 분석 도구는 통계적 신뢰도를 확보하는 데 30~60분이 필요해 데이터 배포 주기와 맞지 않았다. - 입력 데이터가 정상이어도 변환 이후의 최종 상태에서 문제가 발생할 수 있으므로, 실제 클라이언트가 소비하는 출력물을 검증해야 했다. - shadow traffic은 카탈로그 서비스 요청만 재현할 뿐, 여러 서비스가 연동되는 전체 재생 과정을 검증할 수 없었다. - 운영 트래픽을 사용하되, 문제가 발생하면 고객 영향 범위를 즉시 제한할 수 있어야 했다. ## 전용 데이터 카나리 오케스트레이터 - 별도의 카나리 전용 클러스터와 오케스트레이터를 구축해 데이터 검증과 일반 서비스 운영을 분리했다. - **Baseline 클러스터** - 현재 운영 중인 최신 카탈로그 버전을 지속적으로 제공한다. - **Canary 클러스터** - 새 카탈로그 버전을 받아 검증한다. - **오케스트레이터** - baseline과 canary 클러스터의 상태 및 버전 동기화를 확인한다. - 조건이 충족되면 카오스 실험을 시작한다. - 실험 결과를 REST endpoint로 transformer 서비스에 전달한다. - 이 REST 기반의 일반화된 연동 지점 덕분에 다른 데이터 소스도 transformer 코드를 수정하지 않고 유사한 검증 패턴을 적용할 수 있다. ## 카오스 플랫폼을 활용한 실시간 검증 - 10분 이내 검증을 위해 기존 카오스 플랫폼을 확장하고, 실험 임계값을 데이터 카나리 목적에 맞게 조정했다. - 클라이언트 유형별로 트래픽 패턴과 downstream 의존성이 다르므로 주요 tenant마다 별도 실험을 수행했다. - 특히 playback 요청을 처리하는 tenant의 트래픽이 오류를 가장 빠르게 발견했다. - **Sticky canary** - 세션 affinity를 사용해 한 사용자의 트래픽이 실험 중 baseline 또는 canary 중 한쪽에만 계속 연결되도록 한다. - 두 데이터 버전의 결과가 섞이는 것을 막아 공정한 비교가 가능하다. - 기술 지표보다 실제 사용자 행동에 가까운 **Starts Per Second(SPS)** 를 핵심 지표로 사용했다. - 메타데이터 오류는 카탈로그 서비스의 latency나 error rate를 높이지 않고도 재생 시도 자체를 감소시킬 수 있기 때문이다. - 통계 수집이 끝날 때까지 기다리지 않고, 실시간으로 지표를 스트리밍하며 회귀가 감지되는 즉시 실험을 중단한다. - 이는 통계적 확실성을 일부 줄이는 대신, 짧은 배포 주기 안에 문제를 차단하는 속도를 우선한 설계다. ## 운영 환경을 고려한 예외 처리 - 오케스트레이터가 재배포 중 재시작되더라도 진행 중인 카오스 실험을 찾아 계속 polling하도록 했다. - 여러 오케스트레이터 인스턴스가 동시에 실행될 수 있으므로 leader election과 중복 실행 방지 장치를 적용했다. - 한 버전 공지에 대해 실험이 한 번만 실행되도록 보장했다. - 클라이언트별 데이터 소비 주기가 다르기 때문에 baseline과 canary의 버전 상태를 추적하고, 두 클러스터가 올바르게 정렬된 경우에만 실험을 시작한다. ## 의도적인 장애 주입으로 검증 - 시스템의 효과를 확인하기 위해 실제로 카탈로그 데이터를 의도적으로 손상시키는 통제된 실험을 수행했다. - 고관심 타이틀을 denylist에 넣는 등 실제 장애와 유사한 데이터 손상 상황을 재현했다. - 이러한 실패 주입 실험을 통해 실제 재생 트래픽과 SPS 지표가 회귀를 감지하고, 잘못된 데이터 버전이 회원에게 확산되기 전에 중단되는지 검증했다. 데이터 파이프라인도 코드 배포와 마찬가지로 최종 산출물 기준의 카나리 검증이 필요하다. 특히 사용자 영향이 직접 반영되는 지표를 선택하고, 운영 트래픽을 격리된 환경에서 비교하며, 이상 징후가 나타나는 즉시 중단하는 구조가 고속 데이터 배포에 효과적이다.

원문 읽기(새 탭에서 열림)
netflix원문

글로벌 스토리텔링의 (새 탭에서 열림)

넷플릭스는 전 세계 190개국 이상에서 50개 이상의 언어로 서비스를 제공하며 급격히 성장했으나, 이 과정에서 로컬라이제이션(현지화) 분석 워크플로우가 파편화되고 파이프라인이 중복되는 기술 부채를 겪게 되었습니다. 이를 해결하기 위해 넷플릭스는 비즈니스 로직을 중앙 집중화하고 데이터 파이프라인을 통합하는 현대화 전략을 추진하여 보고의 일관성을 확보하고 운영 효율성을 높였습니다. 결과적으로 이러한 아키텍처 개선은 단순한 지표 관리를 넘어, 사용자 경험을 심층적으로 이해하고 현지화 품질을 고도화하는 기반이 되고 있습니다. **데이터 감사와 백엔드 통합 파이프라인 구축** * 기존의 40개가 넘는 대시보드와 도구를 전수 조사하여 사용성과 코드 품질을 평가하고, 프론트엔드 시각화 수정보다는 백엔드 파이프라인 통합에 집중했습니다. * 운영 성과, 생산 역량, 재무 지표 등 서로 분산되어 있던 기존의 더빙 파트너 관련 대시보드들을 하나의 통합 데이터 레이어로 병합하여 관리 효율을 극대화했습니다. * 데이터 소스를 통합함으로써 "특정 자산을 누가 제작했는가"와 같은 복잡한 질문에 대해 단일화된 답변을 제공할 수 있는 환경을 조성했습니다. **'기술 외적 부채' 해결을 통한 인사이트 도출** * 도구가 복잡하여 이해관계자들이 해석에 어려움을 겪는 '기술 외적 부채(Not-So-Tech Debt)'를 해결하기 위해 데이터 스토리텔링 방식을 개선했습니다. * 개별적으로 보고되던 오디오(더빙)와 텍스트(자막) 지표를 '소비 언어(Consumption Language)'라는 개념으로 결합하여, 사용자가 원어로 감상하는지 혹은 현지화된 콘텐츠를 선호하는지 더 직관적으로 파악할 수 있게 했습니다. * 이를 통해 자막과 더빙 중 어떤 방식을 조합했을 때 사용자의 만족도가 높은지 등 구체적인 선호도 데이터를 분석할 수 있게 되었습니다. **중앙 집중형 비즈니스 로직(Write Once, Read Many) 설계** * 로컬라이제이션 지표의 핵심 로직을 '언어 자산 생산자(Language Asset Producer)' 테이블과 같은 공유 테이블로 중앙화하여 비즈니스 로직의 중복을 제거했습니다. * 한 번 정의된 로직을 여러 하위 도메인(더빙 품질, 번역 품질 등)에서 참조하는 구조를 통해, 상위 로직이 변경될 때 모든 시스템에 즉각적으로 반영되도록 설계했습니다. * 이러한 구조적 변화는 데이터의 일관성을 보장하고, 로직 수정 시 발생하는 대규모 유지보수 부담을 획기적으로 줄여주었습니다. **이벤트 레벨 분석을 통한 세밀한 사용자 경험 최적화** * 자산 단위의 지표를 넘어, 개별 자막 줄(line) 단위의 데이터를 캡처하는 '이벤트 레벨 분석'으로 데이터 모델을 확장하고 있습니다. * 자막의 읽기 속도(reading speed)와 같은 미세한 특성이 사용자의 몰입도와 리텐션에 어떤 영향을 미치는지 정교하게 분석합니다. * 분석된 데이터를 바탕으로 번역가들에게 제공하는 스타일 가이드를 정교화하여, 전 세계 모든 사용자가 언어 장벽 없이 최상의 시청 경험을 누릴 수 있도록 지원합니다. 현대적인 데이터 분석 환경을 구축하기 위해서는 단순히 도구를 늘리는 것이 아니라, 파편화된 로직을 중앙화하고 사용자 중심의 데이터 모델로 재설계하는 과정이 필수적입니다. 넷플릭스의 사례처럼 데이터 아키텍처를 '자산' 단위에서 '이벤트' 단위로 구체화하면, 비즈니스 운영 효율화뿐만 아니라 실제 제품의 품질과 고객 경험을 직접적으로 개선하는 강력한 인사이트를 얻을 수 있습니다.

netflix원문

100배 빠르게: 넷플릭스 마에스트로의 워크플로 엔진을 어떻게 강화했는가 (새 탭에서 열림)

넷플릭스는 대규모 데이터 및 머신러닝 워크플로우를 관리하는 오케스트레이터인 'Maestro'의 엔진을 전면 개편하여 성능을 100배 이상 향상시켰습니다. 기존 수 초 단위에 달하던 실행 오버헤드를 밀리초(milliseconds) 단위로 단축함으로써, 광고나 라이브 스트리밍과 같이 저지연 및 고빈도 스케줄링이 필요한 신규 비즈니스 요구사항을 충족하게 되었습니다. 이번 업데이트를 통해 Maestro는 확장성뿐만 아니라 극도로 빠른 실행 속도까지 갖추게 되어 개발자들의 작업 효율을 획기적으로 개선했습니다. **기존 아키텍처의 한계와 병목 현상** * **3계층 구조의 복잡성:** Maestro는 API/런타임, 엔진, 내부 플로우 엔진의 3단계로 구성되었으나, 각 계층 간의 데이터 전달과 상태 동기화 과정에서 상당한 시간이 소요되었습니다. * **폴링(Polling) 방식의 지연:** 기존의 내부 플로우 엔진은 일정 간격으로 태스크를 확인하는 폴링 방식으로 동작하여, 단계별 상태 전이 시마다 초 단위의 불필요한 대기 시간이 발생했습니다. * **분산 큐 및 데이터베이스 부하:** 분산 작업 큐(Dyno-queues)와 데이터베이스 액세스 패턴에서 발생하는 오버헤드로 인해 워크플로우가 복잡해질수록 전체 실행 속도가 저하되는 문제가 있었습니다. * **경합 조건 발생:** 강력한 일관성 보장이 부족하여 특정 단계가 두 개의 워커에서 동시에 실행되는 등의 레이스 컨디션(Race condition) 문제가 간혹 발생했습니다. **100배 빠른 엔진을 위한 설계 최적화** * **이벤트 기반 리액티브 모델:** 폴링 방식을 폐기하고 이벤트 기반 아키텍처를 도입하여, 태스크 완료 즉시 다음 단계가 실행되도록 지연 시간을 최소화했습니다. * **상태 머신 직접 관리:** 워크플로우 그래프를 내부 플로우 태스크로 변환하던 중간 레이어를 제거하고, 엔진이 직접 워크플로우와 단계별 상태 머신을 제어하도록 단순화했습니다. * **데이터 액세스 최적화:** 데이터베이스 쓰기 횟수를 줄이고 효율적인 캐싱 및 분산 잠금(Distributed Locking) 메커니즘을 적용하여 성능과 안정성을 동시에 확보했습니다. * **추상화 계층 정합성:** Maestro 엔진이 상태 전이와 생명주기를 전담하게 함으로써, 하부 플로우 엔진에 대한 의존성을 없애고 엔진의 실행 효율을 극대화했습니다. **성능 향상 결과 및 활용 사례** * **실행 속도 극대화:** 워크플로우 엔진의 내부 오버헤드가 수 초에서 밀리초 단위로 줄어들며 전체적인 응답 속도가 100배 이상 개선되었습니다. * **신규 비즈니스 지원:** 1시간 미만의 짧은 주기로 실행되는 스케줄링이나 광고(Ads), 게임 등 저지연 워크플로우가 필수적인 도메인에 적용 가능해졌습니다. * **개발 생산성 제고:** 반복적인 개발 및 테스트 사이클에서 발생하는 대기 시간이 사라져 엔지니어들의 반복 작업 효율이 크게 향상되었습니다. 대규모 확장성과 초고성능을 동시에 요구하는 환경이라면, 넷플릭스에서 검증되고 오픈 소스로 공개된 최신 버전의 Maestro 도입을 적극적으로 검토해 볼 가치가 있습니다. 특히 기존 워크플로우 엔진의 지연 시간으로 인해 실시간 처리에 어려움을 겪고 있는 조직에 강력한 해결책이 될 수 있습니다.