동영상 서비스를 설계합니다. 올리는 문제는 파일 업로드에서 다뤘으므로, 여기서는 올라온 영상을 어떻게 보게 하는지를 봅니다.
| 항목 | 값 |
|---|---|
| 대상 | 동영상 서비스 |
| 업로드 | 하루 5만 개 (평균 10분) |
| 시청 | 하루 3억 회 (평균 8분 시청) |
| 화질 | 5단계 |
| 시작 | 누른 뒤 2초 안에 첫 화면 |
| 버퍼링 | 재생 시간의 1퍼센트 미만 |
| 조회 분포 | 상위 1퍼센트 영상이 조회의 90퍼센트 |
| 비용 | 전송비가 가장 큰 항목 |
만드는 값과 내려주는 값이 다르다
업로드는 하루 5만 개 (평균 10분)이고 시청은 하루 3억 회 (평균 8분 시청)입니다. 영상 하나를 만드는 값은 한 번만 내고, 내려주는 값은 볼 때마다 냅니다.
그래서 만들 때 일을 더 해서 내려줄 때를 값싸게 만드는 쪽으로 기웁니다. 여러 화질을 미리 만들어 두는 것도, 조각으로 잘라 두는 것도 그 판단입니다.
다만 무한정 그럴 수는 없습니다. 조회가 상위 1퍼센트 영상이 조회의 90퍼센트로 몰려 있어서, 거의 안 보는 영상에 만드는 값을 다 내면 그 값이 그대로 낭비가 됩니다. 이 상충이 뒤에서 한 절을 차지합니다.
통째로 내려주면 안 되는 이유
파일 하나를 그대로 주는 방식은 세 가지가 걸립니다.
| 문제 | 내용 |
|---|---|
| 시작이 늦다 | 다 받아야 재생이 시작된다 |
| 버린 것이 많다 | 30초 보고 껐으면 나머지가 낭비다 |
| 화질을 바꿀 수 없다 | 받는 중에 네트워크가 변해도 대응이 없다 |
첫 번째가 요구사항과 정면으로 부딪힙니다. 2초 안에 첫 화면을 보여줘야 하는데, 10분 영상을 다 받는 데 그보다 훨씬 오래 걸립니다.
그래서 영상을 조각으로 잘라 필요한 만큼만 받게 합니다. 이것이 이 아키타입의 골격입니다.
두 요구가 서로를 밀어낸다
2초 시작과 버퍼링 재생 시간의 1퍼센트 미만은 함께 두면 상충합니다.
시작을 빠르게 하려면 조금만 받고 재생을 시작해야 한다
끊기지 않으려면 넉넉히 받아 두어야 한다
이 둘을 어떻게 함께 지키는지가 뒤의 한 절입니다. 요구사항을 읽을 때 서로 밀어내는 쌍을 찾아 두면 어느 절이 어려울지 미리 알 수 있습니다.
다루지 않는 것
| 뺀 것 | 이유 |
|---|---|
| 올리는 과정 | 파일 업로드 아키타입에서 다룬다 |
| 영상 추천과 순위 | 뉴스 피드 아키타입에서 다룬다 |
| 실시간 방송 | 지연 요구가 완전히 달라 별도 설계가 된다 |
| 자막과 음성 트랙 여러 개 | 같은 구조를 반복 적용하는 문제다 |
세 번째를 빼는 것이 중요합니다. 저장된 영상은 미리 만들어 둘 시간이 있고 실시간 방송은 없습니다. 이 차이가 인코딩과 전송의 모든 결정을 바꾸므로, 하나를 먼저 끝냅니다.