////
Search
Duplicate
🕟

14장. 유튜브 설계

1단계 문제 이해 및 설계 범위 확정

유튜브와 같은 스트리밍 서비스를 설계할 때, 다음의 질문을 해볼 수 있다.
주요 기능은 무엇인가?
어떤 클라이언트를 지원해야 하는가?
DAU, MAU는 몇인가?
사용자의 평균 사용 시간은 어느정도인가?
다국어 지원이 필요한가?
제공하는 미디어의 특성이 있나? 특정 해상도라던가, 비디오 코텍이라던가
암호화가 필요한가?
비디오 파일 크기에 제한이 있나?
클라우드 서비스를 활용해도 되는가?

개략적 규모 측정

위 질문들을 토대로 규모를 개략적으로 측정하고 이를 바탕으로 설계에 임하기에 앞서 면접관에게 동의를 구해야 한다.
설계에 활용할 데이터는 다음과 같다.
일간 능동 사용자
한 사용자가 하루 평균 몇 개의 비디오를 시청하는지
어느정도 비율의 사용자가 주, 일 평균 몇 개의 비디오를 업로드하는지
비디오의 평균 크기
비디오 저장을 위해 요구되는 저장 용량
CDN 비용

2단계 개략적 설계안 제시 및 동의 구하기

개략적으로 봤을 때, 이 시스템은 세 개 컴포넌트로 구성된다.
단말 : 컴퓨터, 모바일 폰, 스마트 TV 등을 이용해 서비스를 이용한다.
CDN : 비디오는 CDN에 저장한다. 재생 버튼을 누르면 CDN으로부터 스트리밍이 이루어진다.
API 서버 : 비디오 스트리밍을 제외한 모든 요청은 API 서버가 처리한다.
피드 추천, 비디오 업로드 URL 생성, 메타데이터 데이터베이스와 캐시 갱신, 사용자 가입 등등이 처리된다.
면접관이 다음 두 주요 기능에 대해서 설계를 요청했다고 가정하자.

비디오 업로드 절차

이 설계안은 다음의 컴포넌트들로 구성되어 있다.
사용자 : 컴퓨터나 모바일 폰, 혹은 스마트 TV를 통해 유튜브를 시청하는 이용자다.
로드밸런서 : API 서버 각각으로 고르게 요청을 분산하는 역할을 담당한다.
메타데이터 데이터베이스 : 비디오의 메타데이터를 보관한다. 샤딩, 다중화를 적용하여 성능 및 가용성 요구사항을 충족한다.
메타데이터 캐시 : 성능을 높이기 위해 비디오 메타데이터와 사용자 객체를 캐시한다.
원본 저장소 : 원본 비디오를 보관할 대형 이진 파일 저장소 시스템이다. BLOB 저장소는 이진 데이터를 하나의 객체로 보관하는 데이터베이스 관리 시스템이다.
트랜스코딩 서버 : 비디오 트랜스코딩은 비디오 인코딩이라고도 부르며 비디오의 포맷을 변환하는 절차다.
트랜스코딩 비디오 저장소 : 트랜스코딩이 완료된 비디오를 저장하는 BLOB 저장소다.
CDN: 비디오를 캐시하는 역할을 담당한다. 사용자가 재생 버튼을 누르면 비디오 스트리밍은 CDN을 통해 이루어진다.
트랜스코딩 완료 큐: 비디오 트랜스코딩 완료 이벤트를 보관할 메시지 큐다.
트랜스코딩 완료 핸들러: 트랜스 완료 큐에서 이벤트 데이터를 꺼내어 메타데이터 캐시와 데이터베이스를 갱신할 작업 서버들이다.

비디오 스트리밍 절차

비디오 스트리밍에 있어서 중요한 부분은 스트리밍 프로토콜이다.
널리 사용되는 프로토콜로는 다음이 있다.
MPEG-DASH
Aple HLS
Microsoft Smooth Streaming
Adobe HTTP Dynamic Streaming

3단계 상세 설계

비디오 트랜스코딩

비디오 트랜스 코딩은 다음과 같은 이유로 중요하다.
가공되지 않은 원본 비디오는 저장 공간을 많이 차지한다.
상당수의 단말과 브라우저는 특정 종류의 비디오 포맷만 지원한다. 따라서 호환성 문제 해결을 위해 여러 포맷으로 인코딩해두는 것이 좋다.
사용자에게 끊김 없는 비디오 재생을 보장하려면 네트워크 대역폭에 따라 적절한 화질로 인코딩된 영상을 보내는 것이 바람직하다.
모바일 단말의 경우, 네트워크 상황이 수시로 달라질 수 있으므로 화질을 선택할 수 있도록 다양한 인코딩을 제공하는 것이 좋다.
인코딩 포맷은 아주 다양하나 큰 틀에서 두 부분으로 구성된다.
컨테이너 : 비디오 파일, 오디오, 메타데이터를 담는 바구니같은 것이다.
코덱 : 비디오 화질은 보존하면서 파일 크기를 줄일 목적으로 고안된 압축 및 압축 해제 알고리즘이다.

유향 비순환 그래프 모델

각기 다른 유형의 비디오 프로세싱 파이프라인 지원, 처리과정의 병렬성 향상을 위해 적절히 추상화하는 과정에서 사용 가능한 도구다.
예를 들어 페이스북의 스트리밍 비디오 엔진은 해당 모델을 도입하여 작업을 단계별로 배열하게끔 한 후, 해당 작업들이 순차적, 병렬적으로 처리될 수 있도록 지원한다.

비디오 트랜스코딩 아키텍처

해당 설계안에서는 클라우드 서비스를 활용해, 비디오 트랜스코딩 아키텍처를 다음, 다섯 개의 주요 컴포넌트를 이용해 설계한다.
전처리기, DAG 스케줄러, 자원 관리자, 작업 실행 서버, 임시 저장소
전처리기
비디오 분할
비디오 스트림을 GOP(Group of Pictures)라 불리는 단위로 쪼갠다.
GOP는 특정 순서로 배열된 프레임 그룹이다. 하나의 GOP는 독립적으로 재생 가능하며, 길이는 보통 몇 초 정도다.
DAG 생성
클라이언트 프로그래머가 작성한 설정 파일에 따라 DAG를 만들어낸다.
데이터 캐시
전처리기는 분할된 비디오의 캐시이기도 하다.
안정성을 높이기 위해 전치리기는 GOP와 메타데이터를 임시 저장소에 보관한다.
비디오 인코딩이 실패하면 시스템은 이렇게 보관된 데이터를 활용해 인코딩을 재개한다.
DAG 스케줄러
DAG 스케줄러는 DAG 그래프를 몇 개 단계로 분할한 다음에 그 각각을 자원 관리자의 작업 큐에 집어 넣는다.
하나의 DAG는 여러 단계로 쪼갤 수 있는데, 하나는 비디오, 오디오, 메타데이터 추출, 두 번째 단계에서는 해당 비디오 파일 인코딩, 썸네일 추출 등을 수행한다.
자원 관리자
자원 관리자는 자원 배분을 효과적으로 수행하는 역할을 담당한다.
이는, 세 개의 큐와 작업 스케줄러로 구성된다.
작업 큐 : 실행할 작업이 보관되더 있는 우선순위 큐이다.
작업 서버 큐 : 작업 서버의 가용 상태 정보가 보관되어 있는 우선순위 큐다.
실행 큐 : 현재 실행 중인 작업 및 작업 서버 정보가 보관되어 있는 큐다.
작업 스케줄러 : 최적의 작업/서버 조합을 골라, 해당 작업 서버가 작업을 수행하도록 지시하는 역할을 담당한다.
자원 관리자는 다음과 같은 역할을 수행한다.
작업 큐에서 가장 높은 우선순위의 작업을 꺼낸다.
해당 작업을 실행하기 적합한 작업 서버를 고른다.
작업 스케줄러는 다음와 같은 역할을 수행한다.
해당 작업 서버에게 작업 실행을 지시한다.
해당 작업이 어떤 서버에게 할당되었는지에 관한 정보를 실행 큐에 넣는다.
자겅ㅂ이 완료되면 해당 작업을 실행 큐에서 제거한다.
작업 서버
작업 서버는 DAG에 정의된 작업을 수행한다. 작업 종류에 따라 작업 서버도 구분하여 관리한다.

시스템 최적화

속도
비디오 병렬 업로드 : 비디오 전부를 하나의 업로드로 올리는 것보다 여러 GOP로 분할하여 병렬적으로 업로드하는 것이 더 빠르게 데이터를 전달할 수 있다.
업로드 센터를 사용자 근거리에 지정
모든 지점마다 병렬화를 고려
안정성
비디오 보호 : 디지털 저작권 관리, AES 암호화, 워터마크 등을 이용해 디지털 자산을 보완할 수 있다.

오류 처리

이런 거대한 시스템은 오류가 발생할 지점도 엄청 많다. 이런 시스템의 오류 관용성을 향상시킬려면 오류를 우아하게 처리하고 빠르게 회복할 수 있어야 한다.
시스템 오류에는 다음과 같은 두 종류가 있다.
회복 가능 오류 : 특정 비디오를 트랜스코딩하다 실패한다든가의 오류는 회복 가능한 오류에 속한다. 이런 오류는 보통 몇 번 재시도하면 해결되기 때문이다.
회복 불가능 오류 : 비디오 포맷이 잘못되었다던가 하는 회복 불가능한 오류의 경우, 시스템은 해당 비디오에 대한 작업을 중지하고 클라이언트에게 오류 코드를 제공해야 한다.
각 지점 별로 발생할 가능성이 있는 오류를 체크한 후, 이에 대한 처리로직까지 제안한다면 더 나은 시스템 면접 결과가 될 것이다.

4단계 마무리

이렇게 설명하고도 시간이 남았다면 다음 사항들을 추가적으로 논의해볼 수 있다.
API 계층의 규모 확장성 확보 방안
데이터베이스 계층의 규모 확장성 확보 방안
라이브 스트리밍 기능 추가 제공
이는 응답지연이 더 낮은 서비스여야 하며 스트리밍 프로토콜 선정에 더 주의를 기울여야 한다.
비디오 삭제 절차
불법적인 비디오, 선정적 비디오는 지워야 한다. 내릴 비디오는 관리자가 임의로 선정할 수도 있지만 사용자의 신고 절차를 통해 제거되어야할 수도 있다.