Netflix System Design
Encoding Pipeline
Content Lifecycle State Machine
Every title transitions through these states. A title is never published until all required assets pass QC.
Pipeline Stages
Click any stage for implementation details and design considerations.
Parallel transcoding jobs for each output profile. Typically 15β20 output variants per title. Each variant is an independent job β failures are retried independently.
Encoding Variants (Codec Ladder)
Each title is transcoded into 15β20 output profiles. Client ABR selects the right one based on bandwidth and device capability.
| Resolution | Quality | Bitrate Range | Codec | Device Compatibility |
|---|---|---|---|---|
| 3840Γ2160 | 4K UHD | 15β25 Mbps | H.265 / AV1 | 4K TVs, high-end mobile |
| 1920Γ1080 | 1080p Full HD | 5β10 Mbps | H.264 / H.265 | Most smart TVs, laptops |
| 1280Γ720 | 720p HD | 2.5β5 Mbps | H.264 | Mid-range mobile, tablets |
| 960Γ540 | 540p | 1β2.5 Mbps | H.264 | Low-bandwidth fallback |
| 640Γ480 | 480p SD | 0.5β1 Mbps | H.264 | Very low bandwidth / mobile data |
| 320Γ240 | 240p | 0.2β0.5 Mbps | H.264 | 2G/3G mobile fallback |
Idempotency & Job Queue Design
Each encoding job has a deterministic job ID = hash(titleId + outputProfile + inputChecksum). Re-submitting the same job is a no-op if output already exists in storage.
Job queue (SQS/Kafka): jobs are visibility-timeout based. If a worker crashes mid-job, the message reappears after timeout for another worker to pick up.
Output written to a content-addressed path (hash of output). Final step: atomic rename/link to canonical path once complete. Readers always see either old complete output or new complete output β never partial.