파일 바이트는 API 서버를 우회하고, 세션·part 범위·checksum·만료만 control plane이 관리합니다.
동영상 플랫폼
설계
영상 파일 하나는 업로드, 검사, 인코딩, manifest, edge cache, 재생 이벤트를 거칩니다. 이 경로를 하나의 서버가 아닌 서로 다른 일관성·비용·권한 경계를 가진 세 평면으로 나누어 설계합니다.
대용량 바이트는 서명된 재개 가능 업로드로 quarantine storage에 직접 넣고, 검사 통과 뒤 durable job으로 변환합니다. 여러 rendition과 HLS/DASH manifest는 versioned output으로 publish하며, 재생은 권한 확인 뒤 CDN으로 보냅니다. 조회수는 video row가 아니라 멱등 이벤트 로그에서 집계합니다.
파일 도착과 재생 가능은 다른 완료 상태다
업로더가 보는 진행률, 운영자가 보는 검사·job 상태, 시청자가 보는 실제 재생 가능 여부를 하나의 boolean으로 합치지 않습니다. metadata와 rights policy가 정본이고 rendition·manifest·cache는 versioned 파생물입니다.
raw object는 public read 없이 quarantine에 두고, virus scan·media probe가 pass하기 전 변환하지 않습니다.
플레이어가 bandwidth와 buffer에 맞는 rendition을 고를 수 있도록 manifest·segment를 제공합니다.
재시도된 heartbeat가 공개 조회수를 부풀리지 않도록 session/event key로 중복을 제거합니다.
control, media, analytics plane을 분리한다
업로드와 playback은 byte-heavy media plane에, video state·권한은 control plane에, event는 append-only analytics plane에 둡니다. CDN cache는 빠른 전달 장치이지 공개 권한의 정본이 아닙니다.
raw object를 검사한 뒤 비동기 job으로 포장한다
owner quota·크기·MIME 범위를 확인하고 signed part URL을 발급합니다.
storage가 확정한 range부터 네트워크 단절 뒤 다시 전송합니다.
checksum, 바이러스, container, decode 한계를 통과한 입력만 허용합니다.
profile version을 넣어 durable queue에 기록하고 같은 job은 멱등 처리합니다.
rendition·thumbnail·caption과 HLS/DASH manifest를 attempt prefix에 작성합니다.
최소 ladder의 객체 검증 뒤에만 published version을 새 manifest로 교체합니다.
평균 QPS보다 byte와 hot video를 먼저 계산한다
다음은 학습용 가정입니다. DAU 2,000만, 하루 20만 업로드, 원본 평균 800MB면 raw ingest는 약 160TB/day입니다. 시청 수가 1.2억 plays/day라도 hot video의 동시 segment 요청은 평균으로 가려집니다.
| 평면 | 병목 단위 | 확장 단위 | 우선 관측 |
|---|---|---|---|
| Upload | bytes/s, 열린 세션, multipart retry | region endpoint, object key prefix, owner quota | completed bytes, resume, checksum mismatch |
| Transcode | 분·해상도·codec·worker time | profile/priority queue, CPU·GPU pool | oldest job age, attempt, validation failure |
| Playback | segment bytes/s, cache miss, hot key | CDN POP, origin shield, multi-origin | startup, rebuffer, hit ratio, origin 5xx |
| Analytics | events/s, late data, unique key state | topic partition, window aggregate, archive tier | ingest lag, duplicate ratio, watermark delay |
partial publish와 권한 철회를 별도 장애로 다룬다
클라이언트는 성공을 보았지만 object가 불완전하거나 complete가 여러 번 올 수 있습니다.
parser 취약 입력이나 압축 폭탄이 scan·transcode worker의 자원을 독점할 수 있습니다.
4K job·hot creator가 일반 영상의 publish 시간을 밀어냅니다.
manifest가 먼저 공개되면 player는 404나 decode error로 시작에 실패합니다.
POP 장애나 cache expiry가 한 origin에 burst를 몰고 rebuffering을 만듭니다.
mobile retry와 collector 재전송이 집계를 부풀리거나 watermark를 늦춥니다.
오래 유효한 URL과 stale edge cache가 이미 막아야 할 재생을 허용할 수 있습니다.
한 video key가 origin bandwidth, event partition, metadata cache를 동시에 압박합니다.
권한, 지표, lifecycle을 media pipeline 밖에서 운영한다
upload URL을 owner·prefix·크기·만료에 묶고 raw bucket은 public read를 막습니다. playback은 visibility·entitlement·rights hold를 매번 확인하며 token·PII는 trace에서 제거합니다.
revoke_to_deny_secondsvideo_id, version, job ID, play session을 연결해 upload 완료부터 첫 재생까지 추적합니다. rebuffer·cache hit·origin 5xx와 job backlog를 user ID 없이 봅니다.
raw 원본, rendition ladder, GPU/CPU 변환, CDN egress, raw heartbeat 보관이 비용입니다. object TTL·noncurrent version·lifecycle tier로 복구 기간과 비용을 함께 정합니다.
origin_egress_bytes_total전송 프로토콜과 집계 정확도를 제품 계약으로 고른다
| 선택 | 강점 | 비용·제약 | 판단 기준 |
|---|---|---|---|
| HLS only | protocol·QA surface가 작음 | DASH 요구 client와의 호환성 검토 필요 | MVP의 지원 기기와 player |
| HLS + DASH | protocol 선택성, 폭넓은 생태계 | packager·manifest·DRM·관측 매트릭스 증가 | device/partner 요구와 운영 역량 |
| full ladder before publish | 재생 선택 폭이 넓고 버전 단순 | 게시 지연·변환 비용 증가 | 품질 SLA가 publish SLA보다 우선일 때 |
| minimum ladder first | 빠른 게시와 초기 비용 절약 | 점진적 rendition·version 운영 필요 | creator UX와 긴 원본 비율 |
| exact unique count | 정산·감사에 설명 가능 | identity/privacy/state 비용 큼 | billing-grade 경로 |
| near-real-time estimate | 빠른 인기 신호와 낮은 비용 | final count와 차이·재계산 필요 | 공개 조회수·추천 feature |
- 먼저 VOD/live, public/private/paid, 게시 완료의 정의, 처리 지연과 조회수의 정확도를 질문한다.
- 원본 byte·업로드 concurrency·변환 시간과 재생 segment egress·hot video를 따로 추정한다.
- metadata/rights/job ledger와 rendition/manifest/cache/aggregate의 정본·파생 경계를 말한다.
- resumable direct upload → scan/probe → durable job → validate → atomic publish를 설명한다.
- 권한 확인 뒤 CDN에 전달하고, queue lag·partial publish·CDN/origin·중복 event·rights revoke의 지표와 rollback을 마무리한다.
프로토콜 사실은 공식 문서에서 확인한다
- RFC 8216 — HTTP Live Streaming · playlist, media segment, variant stream의 공식 규격.
- ISO/IEC 23009-1:2022 — MPEG-DASH · MPD와 segment format의 ISO 표준 페이지.
- Google Cloud Transcoder API — Overview · 비동기 job과 HLS/DASH output의 공식 제품 개요.
- Google Cloud CDN — Overview · edge cache와 CDN delivery의 공식 문서.
- Cloud Storage — Object Lifecycle Management · object TTL·version lifecycle의 공식 문서.
- YouTube Data API — Resumable Uploads · 세션 URI와 range 기반 재개 업로드의 공식 가이드.
- 이 페이지의 규모, rendition ladder, segment 길이, cache/token TTL, queue 경계, 조회수 threshold, 장애 SLO는 학습용 설계 가정입니다.
작성·검토·참고 자료
참고 자료
- RFC 8216 — HTTP Live Streaming: playlist, media segment, variant stream, encryption 관련 규범/설명 문서.
- ISO/IEC 23009-1:2022 — Dynamic adaptive streaming over HTTP (DASH): MPD와 segment format의 ISO 표준 페이지.
- Google Cloud Transcoder API — Overview: 비동기 transcoding job, Cloud Storage input/output, HLS/DASH output의 공식 제품 개요.
- Google Cloud CDN — Overview: edge cache와 CDN delivery의 공식 개요.
- Google Cloud Storage — Object Lifecycle Management: object TTL, version/lifecycle action의 공식 문서.
- YouTube Data API — Resumable Uploads: 세션 URI와 range 기반 재개 업로드의 공식 가이드. 이 문서의 규모 수치, segment 길이, rendition ladder, cache/token TTL, queue 분리, view threshold, failure SLO는 제품 사실이 아니라 학습용 **설계 가정**이다.
사실 오류·출처 정정은 문의·정정 페이지로 알려 주세요.