Foundry
동영상 스트리밍 설계
중급
핵심

요구사항과 재생이라는 문제

한 번 만들고 수천 번 내려준다

동영상 서비스를 설계합니다. 올리는 문제는 파일 업로드에서 다뤘으므로, 여기서는 올라온 영상을 어떻게 보게 하는지를 봅니다.

항목
대상동영상 서비스
업로드하루 5만 개 (평균 10분)
시청하루 3억 회 (평균 8분 시청)
화질5단계
시작누른 뒤 2초 안에 첫 화면
버퍼링재생 시간의 1퍼센트 미만
조회 분포상위 1퍼센트 영상이 조회의 90퍼센트
비용전송비가 가장 큰 항목

만드는 값과 내려주는 값이 다르다

영상 하나를 한 번 만들어 수천 번 내려주므로 만드는 비용을 읽기로 갚는다 비율이 커서 막대로 그릴 수 없다 업로드 5만 하루 시청 3억 6000배 영상 하나를 만드는 데 드는 값은 한 번만 낸다 내려주는 값은 볼 때마다 낸다 그래서 만들 때 일을 더 해서 내려줄 때를 값싸게 만든다 다만 무한정 그럴 수는 없다 거의 안 보는 영상에 만드는 값을 다 내면 그 값이 낭비가 된다

업로드는 하루 5만 개 (평균 10분)이고 시청은 하루 3억 회 (평균 8분 시청)입니다. 영상 하나를 만드는 값은 한 번만 내고, 내려주는 값은 볼 때마다 냅니다.

그래서 만들 때 일을 더 해서 내려줄 때를 값싸게 만드는 쪽으로 기웁니다. 여러 화질을 미리 만들어 두는 것도, 조각으로 잘라 두는 것도 그 판단입니다.

다만 무한정 그럴 수는 없습니다. 조회가 상위 1퍼센트 영상이 조회의 90퍼센트로 몰려 있어서, 거의 안 보는 영상에 만드는 값을 다 내면 그 값이 그대로 낭비가 됩니다. 이 상충이 뒤에서 한 절을 차지합니다.

통째로 내려주면 안 되는 이유

파일 하나를 그대로 주는 방식은 세 가지가 걸립니다.

문제내용
시작이 늦다다 받아야 재생이 시작된다
버린 것이 많다30초 보고 껐으면 나머지가 낭비다
화질을 바꿀 수 없다받는 중에 네트워크가 변해도 대응이 없다

첫 번째가 요구사항과 정면으로 부딪힙니다. 2초 안에 첫 화면을 보여줘야 하는데, 10분 영상을 다 받는 데 그보다 훨씬 오래 걸립니다.

그래서 영상을 조각으로 잘라 필요한 만큼만 받게 합니다. 이것이 이 아키타입의 골격입니다.

두 요구가 서로를 밀어낸다

2초 시작과 버퍼링 재생 시간의 1퍼센트 미만은 함께 두면 상충합니다.

시작을 빠르게 하려면 조금만 받고 재생을 시작해야 한다
끊기지 않으려면 넉넉히 받아 두어야 한다

이 둘을 어떻게 함께 지키는지가 뒤의 한 절입니다. 요구사항을 읽을 때 서로 밀어내는 쌍을 찾아 두면 어느 절이 어려울지 미리 알 수 있습니다.

다루지 않는 것

뺀 것이유
올리는 과정파일 업로드 아키타입에서 다룬다
영상 추천과 순위뉴스 피드 아키타입에서 다룬다
실시간 방송지연 요구가 완전히 달라 별도 설계가 된다
자막과 음성 트랙 여러 개같은 구조를 반복 적용하는 문제다

세 번째를 빼는 것이 중요합니다. 저장된 영상은 미리 만들어 둘 시간이 있고 실시간 방송은 없습니다. 이 차이가 인코딩과 전송의 모든 결정을 바꾸므로, 하나를 먼저 끝냅니다.

면접에서 이렇게 나옵니다

Q.영상 서비스에서 만드는 값과 내려주는 값의 차이가 설계에 어떻게 반영됩니까

만들 때 일을 더 해서 내려줄 때를 값싸게 만드는 쪽으로 기웁니다.

업로드는 하루 5만 개 (평균 10분)이고 시청은 하루 3억 회 (평균 8분 시청)입니다. 만드는 값은 한 번만 내고 내려주는 값은 볼 때마다 냅니다.

여러 화질을 미리 만들어 두는 것도, 조각으로 잘라 두는 것도 그 판단에서 나옵니다.

흔한 실수: 이 원칙을 끝까지 밀어붙이는 것. 조회가 상위 1퍼센트 영상이 조회의 90퍼센트로 몰려 있어서 거의 안 보는 영상에 만드는 값을 다 내면 낭비가 됩니다. 원칙과 그 예외를 함께 알고 있어야 합니다.

Q.영상 파일을 통째로 내려주면 무엇이 문제입니까

시작이 늦고, 버린 것이 많고, 화질을 바꿀 수 없습니다.

문제내용
시작이 늦다다 받아야 재생이 시작된다
버린 것이 많다30초 보고 껐으면 나머지가 낭비다
화질을 바꿀 수 없다받는 중에 네트워크가 변해도 대응이 없다

첫 번째가 요구사항과 정면으로 부딪힙니다. 2초 안에 첫 화면을 보여줘야 하는데 10분 영상을 다 받는 데는 훨씬 오래 걸립니다.

흔한 실수: 파일 앞부분부터 받아 재생하면 된다고 답하는 것. 그것만으로는 화질을 바꿀 수 없고, 중간으로 건너뛸 때 어디를 요청해야 하는지도 알 수 없습니다.

Q.요구사항에서 서로 밀어내는 쌍을 찾으면 무엇을 얻습니까

어느 절이 어려울지 미리 압니다.

2초 시작과 버퍼링 재생 시간의 1퍼센트 미만이 그 쌍입니다.

시작을 빠르게 하려면 조금만 받고 시작해야 한다
끊기지 않으려면 넉넉히 받아 두어야 한다

하나를 만족하면 다른 하나가 나빠집니다. 이런 쌍은 설계에서 절충이 필요한 지점이므로 따로 다뤄야 합니다.

흔한 실수: 두 요구를 각각 만족시키려는 것. 그러면 나중에 한쪽을 고칠 때마다 다른 쪽이 나빠지는 순환에 들어갑니다. 상충을 먼저 인정하고 함께 다루는 방법을 찾아야 합니다.

Q.실시간 방송을 이번 범위에서 빼는 이유가 무엇입니까

미리 만들어 둘 시간이 있는지가 다르기 때문입니다.

저장된 영상은 올린 뒤 여유가 있어서 여러 화질을 미리 만들 수 있습니다. 실시간 방송은 지금 들어오는 것을 지금 내보내야 합니다.

이 차이가 인코딩과 전송의 모든 결정을 바꿉니다. 화질을 몇 개 만들지, 조각을 얼마로 자를지, 버퍼를 얼마나 둘지가 전부 달라집니다.

흔한 실수: 둘을 한 설계로 덮으려는 것. 공통 부분이 있어 보이지만 제약이 다르면 결론이 달라집니다. 하나를 끝낸 뒤 그 결정들을 다시 검토하는 편이 낫습니다.

먼저 스스로 답해보고 아래 답변과 견줘보세요. 막히는 부분은 문제로 확인할 수 있어요.

읽었으면 문제로 확인해보세요

동영상 스트리밍 설계 문제를 풀면 틀린 문제가 자동으로 노트에 쌓입니다. 가입 없이 5문제를 먼저 풀어볼 수도 있어요.