[번역] 넷플릭스에서의 임프레션 소개
[넷플릭스에서의 임프레션 소개] 파트 1: 임프레션에 대한 단일 출처(Source of Truth) 만들기
넷플릭스에서 영화를 찾아보며 스크롤을 내릴 때마다, 각 영화 포스터나 프로모션 배너는 사용자의 눈길을 사로잡기 위해 경쟁합니다. 사용자가 포스터 위에 마우스를 올려놓는 순간은 단지 시각적인 자리만 차지하는 것이 아니라, 넷플릭스의 고도화된 개인화 엔진을 움직이는 중요한 데이터 포인트가 됩니다. 우리는 이 이미지들을 “임프레션(impressions)”이라 부르며, 단순히 콘텐츠를 스치듯 보던 사용자 경험을 개인 맞춤형 몰입 경험으로 바꾸는 핵심 역할을 합니다.
이러한 순간을 포착하고, 각 프로필의 노출 이력을 상세하게 추적하며, 이를 개인화 추천에 활용하기 위해서는 첨단 시스템이 필요합니다. 클라이언트 측 임프레션을 처리하고, 탄탄한 노출 이력을 유지하는 이 정교한 데이터 및 기술의 결합이 바로 넷플릭스가 각 사용자에게 맞춤형 콘텐츠를 제공할 수 있는 근간이 됩니다.
이번 다중 파트 블로그 시리즈에서는 매일 수십억 건의 임프레션을 처리하는 시스템의 내부 과정을 소개합니다. 어떤 어려움이 있고, 클라이언트 측 임프레션을 받아 궁극적으로는 개인화된 콘텐츠 발견 경험으로 탈바꿈하는 과정을 어떻게 견고하게 구축했는지 보여드리겠습니다.
⸻
임프레션이 필요한 이유
- 개인화 향상
더 나은 맞춤형 추천을 위해서는 사용자가 이미 어떤 콘텐츠를 접했는지를 추적하는 것이 중요합니다. 임프레션 이력을 통해, 홈 화면에 표시되었으나 사용자가 관심을 두지 않았던 콘텐츠를 파악하여, 더욱 새롭고 흥미로운 추천을 제공할 수 있습니다.
- 노출 빈도 제한(Frequency Capping)
임프레션 이력을 유지하면, 동일한 콘텐츠가 과도하게 노출되는 것을 방지하기 위한 빈도 제한을 도입할 수 있습니다. 이는 사용자가 같은 옵션을 반복해서 보는 일을 막아, 시청 경험을 더욱 쾌적하게 만들고 피로도를 줄입니다.
- 신규 타이틀 강조
새로운 콘텐츠의 경우, 임프레션 이력을 활용해 최초 사용자 반응을 모니터링하고 그에 따라 머천다이징 전략을 조정할 수 있습니다. 다양한 콘텐츠 배치 방법이나 프로모션 전략을 시도해, 시청률과 참여도를 높이는 데 도움이 됩니다.
- 분석 인사이트
추가로, 임프레션 이력은 플랫폼 관련 분석 질의에도 유용한 정보를 제공합니다. 예를 들어 특정 행(row)의 성과를 평가하거나, 머천다이징 전략의 효율성을 판단하는 데 임프레션 이력을 분석해 활용할 수 있습니다.
⸻
아키텍처 개요
임프레션을 관리하는 데 있어 가장 중요한 첫 단계는 임프레션에 대한 단일 출처(Source of Truth, SOT) 데이터를 만드는 것입니다. 이 데이터세트는 다양한 다운스트림 워크플로우와 여러 활용 사례의 기반이 됩니다.
- Raw 임프레션 이벤트 수집
넷플릭스 회원이 플랫폼을 탐색하면서 UI와 상호작용하는 순간순간, 다양한 Raw 이벤트가 발생합니다. 이 이벤트들은 클라이언트 측에서 서버로 빠르게 전달되어, 중앙 이벤트 처리 큐에 적재됩니다. 전 세계 사용자들에게서 발생하는 이벤트를 수집하기 위해 이 큐를 사용해 지속적으로 Raw 이벤트를 모읍니다.
이후 Raw 이벤트는 중앙 큐에 모인 뒤, 맞춤 이벤트 추출기(event extractor)를 거쳐 임프레션 이벤트만 선별·추출됩니다. 이렇게 추출된 이벤트는 두 가지 경로로 전송됩니다. 1. 실시간 처리가 필요한 워크플로우를 위해 Apache Kafka 토픽으로 전송 2. 장기 보존 및 분석을 위해 Apache Iceberg 테이블에도 저장
이중 경로를 사용하는 이유는, Kafka가 저지연 스트리밍을 제공하는 동시에 Iceberg를 통해 대규모 불변 데이터세트를 효율적으로 관리하여 장기 분석에 활용할 수 있기 때문입니다.
⸻
- Raw 임프레션 필터링 및 풍부화(Enrichment)
Raw 임프레션 이벤트가 큐에 들어오면, 무상태(Stateless) Apache Flink 잡이 이를 세밀하게 처리합니다. 이 단계에서는 유효하지 않은 항목을 걸러내고, 유효한 임프레션에는 쇼나 영화 타이틀 정보, 해당 임프레션이 표시된 페이지·행 위치 등 추가 메타데이터를 붙여줍니다.
이렇게 풍부화된 데이터는 Avro 스키마 형태로 구조화되어, 넷플릭스 임프레션 데이터의 결정적 근거(소스 오브 트루스)가 됩니다. 풍부화된 데이터는 Kafka를 통해 실시간 사용 사례에 바로 접근 가능하며, 동시에 Apache Iceberg 테이블에도 저장되어 과거 데이터에 대한 분석 역시 가능하도록 지원합니다. 이로써 실시간 처리 역량과 장기 데이터 보존이라는 두 마리 토끼를 잡게 됩니다.
⸻
임프레션 품질 보장
최고 품질의 임프레션을 유지하는 것은 매우 중요합니다. 이를 위해 각 임프레션의 상태와 품질을 확인할 수 있는 상세한 열(column) 단위 메트릭을 수집합니다. 예를 들어, 식별자가 유효한지, 필수 컬럼이 제대로 채워져 있는지 등을 점검합니다. 이렇게 수집된 메트릭들은 종합 대시보드로 모여, 계층화된 임계치 기반 알림 시스템을 지원합니다. 잠재적인 문제가 발견되면 신속하게 알림을 발송해 빠른 대응이 가능하도록 합니다. 또한 데이터 풍부화 과정에서, 모든 컬럼 값이 서로 일치하도록 보정이 필요한 경우 즉시 수정해 최종 데이터의 정확도를 최대한 높입니다.
⸻
설정(Configuration)
글로벌 전역에서 초당 1150만 건(약 11.5 million)의 임프레션 이벤트가 발생하며, 각 이벤트 크기는 약 1.2KB 정도입니다. 이를 실시간으로 효율적으로 처리하기 위해 Apache Flink의 저지연 스트림 처리 기능을 활용합니다. Flink는 배치와 스트림 처리를 겸할 수 있어, 과거 데이터 백필(backfill)을 쉽게 수행하고 실시간/역사적 분석 간 일관성을 유지하는 데에도 적합합니다.
Flink 설정은 지역(리전)별로 8개의 태스크 매니저(Task Manager)를 두고, 각 매니저마다 CPU 8코어와 32GB 메모리를 할당합니다. 병렬성(parallelism)은 48로 설정하여, 대규모 트래픽을 무리 없이 소화하고 안정적인 성능을 낼 수 있도록 했습니다. Flink 잡의 싱크(sink) 단계에는 데이터 메시(Data Mesh) 커넥터가 사용되는데, 여기서 데이터는 Kafka와 Iceberg 두 곳으로 전송됩니다. 이로써 실시간 스트리밍은 Kafka에서, 장기 저장은 Iceberg에서 각각 담당하며, 유연하고 종합적인 데이터 처리·저장을 구현합니다.
Flink 잡은 ‘아일랜드 모델(island model)’ 방식으로 배포되어, 각 지역에서 필요한 모든 의존성을 하나의 리전 내에서 처리합니다. 이는 지역 간 격리를 통해 고가용성을 보장하는 방식으로, 특정 리전에 장애가 발생하더라도 다른 리전에는 영향을 주지 않고 트래픽을 재분배할 수 있습니다. 따라서 특정 리전에 들어오는 모든 데이터는 해당 리전에 배포된 Flink 잡이 전담해 처리합니다.
⸻
앞으로의 과제(Future Work)
- 스키마가 없는(Unschematized) 이벤트 처리
Raw 이벤트가 스키마 없이 중앙 처리 큐에 쌓이는 것은 유연성을 높여주지만, 동시에 문제도 야기합니다. 스키마가 없으면, 누락된 데이터가 의도된 것인지 로깅 에러인지 구분하기 어렵습니다. 스키마 관리의 유연성을 유지하면서도 명확성을 제공할 수 있는 방안을 모색 중입니다.
- 오토스케일러(Autoscaler)를 통한 자동 성능 최적화
현재 Apache Flink 잡의 성능 튜닝은 수동으로 이루어지고 있습니다. 앞으로는 오토스케일러와의 연동을 통해, 워크로드 요구에 따라 자원을 동적으로 조정할 계획입니다. 이를 통해 성능 최적화뿐만 아니라 자원 활용 효율도 높일 수 있으리라 기대합니다.
- 데이터 품질 알림 개선
현재는 다수의 비즈니스 규칙에 의해 데이터를 검증하고, 그 결과에 따라 알림을 띄우는 형태라서 오탐(false positive)이 많고, 수동으로 판단해야 하는 경우도 많습니다. 또, 데이터 계보(lineage) 정보가 충분치 않아, 어떤 변경점이 어떻게 퀄리티에 영향을 주었는지 추적하기가 어렵습니다. 이를 해결하고자 더 지능적인 이상 감지 기능, 데이터 계보·거버넌스 추적, 생산자를 향한 회귀(regression) 알림 기능을 갖춘 종합적인 데이터 품질 플랫폼을 구축 중입니다. 이를 통해 효율성을 높이고 수동 확인을 줄이며, 데이터 무결성을 강화할 계획입니다.
⸻
결론
임프레션에 대한 신뢰할 수 있는 **단일 출처(SOT)**를 만드는 일은 복잡하지만, 개인화 및 콘텐츠 발견 경험을 크게 향상하는 데 필수적인 작업입니다. 다음 파트에서는 이 SOT 데이터세트를 활용해 임프레션 히스토리를 제공하는 마이크로서비스를 어떻게 만드는지 좀 더 깊이 살펴보겠습니다. 의견이 있으시다면 댓글로 공유 부탁드리며, 임프레션에 대한 여정을 함께 이어가 주시기 바랍니다.
⸻
감사의 말
임프레션 시스템의 성공을 위해 기여해주신 훌륭한 동료들께 감사드립니다: Julian Jaffe, Bryan Keller, Yun Wang, Brandon Bremen, Kyle Alford, Ron Brown, Shriya Arora.
댓글을 작성하려면 로그인이 필요합니다.
로그인하기