Проектирование Youtube
title: Проектирование YouTube description: Архитектура YouTube — загрузка и транскодирование видео, глобальная CDN-доставка, рекомендательная система, поиск, live-стриминг и монетизация.
Проектирование YouTube
Введение
YouTube — крупнейшая видеоплатформа в мире и второй по посещаемости сайт (после Google).
- ~2.5 млрд активных пользователей в месяц
- ~500 часов видео загружается каждую минуту
- ~1 млрд часов видео просматривается ежедневно
- ~720 000 часов нового контента добавляется ежедневно
- Поддержка 4K, 8K, HDR, 360° видео
Проектирование YouTube охватывает множество подсистем:
- Загрузка и обработка — приём видео, транскодирование в десятки форматов
- Хранение — петабайты видеоконтента
- Доставка — глобальная CDN с минимальной задержкой
- Поиск — полнотекстовый поиск + рекомендации
- Монетизация — рекламная платформа, встроенная в каждое видео
Требования
Функциональные требования
| # | Требование |
|---|---|
| FR-1 | Пользователь может загрузить видео (до 256 ГБ / 12 часов) |
| FR-2 | Пользователь может смотреть видео с адаптивным качеством (144p–4K) |
| FR-3 | Поиск видео по заголовку, описанию, тегам |
| FR-4 | Комментарии, лайки/дизлайки, подписки на каналы |
| FR-5 | Рекомендации — лента «Главная», «Рекомендуемые» |
| FR-6 | Live-стриминг (прямые трансляции) |
| FR-7 | Монетизация: реклама pre-roll/mid-roll, YouTube Premium |
Нефункциональные требования
| # | Требование | Целевое значение |
|---|---|---|
| NFR-1 | Время начала воспроизведения (TTFB) | < 200 мс |
| NFR-2 | Rebuffering rate | < 1% |
| NFR-3 | Доступность | 99.99% |
| NFR-4 | Задержка загрузки видео до публикации | < 10 минут для 10-мин видео |
| NFR-5 | Масштабируемость | 2.5 млрд пользователей |
| NFR-6 | Глобальное покрытие | Доступность в 100+ странах |
Оценка масштаба
Загрузка видео
500 часов видео в минуту
= 30 000 часов/час
= 720 000 часов/день
Средний размер видео (1080p, 10 мин): ~700 МБ
Видео в минуту: ~500 часов / 0.17 часа ≈ 3 000 видео/мин ≈ 50 видео/сек
Входящий трафик: 50 видео/сек × 700 МБ / 600 сек ≈ 60 ГБ/сек
Просмотр видео
1 млрд часов просмотра в день
= 41.7 млн часов/час
= 11 574 часа/сек
Средний битрейт: 5 Mbps (1080p)
Исходящий трафик: 11 574 × 5 Mbps ≈ 58 Тбит/сек
Это ~5.8 МИЛЛИОНОВ одновременных зрителей в 1080p
Хранилище
720 000 часов нового видео в день
Каждое транскодируется в ~10 качеств (144p, 240p, 360p, 480p, 720p, 1080p, 1440p, 4K + аудио)
Итого: ~720 000 × 10 × (средний размер часа ≈ 1.5 ГБ) = ~10.8 ПБ/день
В год: ~4 ЭБ (экзабайт) нового контента
YouTube — одна из крупнейших систем хранения данных на планете.
High-level архитектура
┌──────────────────────────────────────────────────────────────────┐
│ ПОЛЬЗОВАТЕЛИ │
│ Загрузка видео │ Просмотр │ Поиск │ Комменты │
└──────────────┬────────────┴─────┬────┴───┬───┴───────────────────┘
│ │ │
▼ │ ▼
┌──────────────────────┐ │ ┌────────────────────┐
│ UPLOAD SERVICE │ │ │ SEARCH SERVICE │
│ │ │ │ (Elasticsearch/ │
│ Chunked upload │ │ │ custom index) │
│ → Object Storage │ │ └────────────────────┘
│ → Transcoding Queue │ │
└──────────┬───────────┘ │
│ │
▼ │
┌──────────────────────┐ │
│ TRANSCODING │ │
│ PIPELINE │ │
│ │ │
│ FFmpeg workers │ │
│ → 10+ качеств │ │
│ → thumbnails │ │
│ → subtitles │ │
└──────────┬───────────┘ │
│ │
▼ ▼
┌──────────────────────────────────────────────────────────────────┐
│ OBJECT STORAGE (Google Colossus / GCS) │
│ │
│ Original videos │ Transcoded variants │ Thumbnails │ Subtitles │
└──────────────────────────────┬───────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────────────┐
│ GLOBAL CDN │
│ │
│ Edge servers в 100+ странах │
│ Кеширование популярных видео │
│ HLS/DASH адаптивный стриминг │
└──────────────────────────────┬───────────────────────────────────┘
│
▼
ЗРИТЕЛЬ
(браузер / мобильное / SmartTV)
Система состоит из трёх основных потоков:
- Upload Pipeline — загрузка → транскодирование → публикация
- View Pipeline — запрос → CDN → адаптивный стриминг
- Metadata Pipeline — поиск, рекомендации, комментарии, аналитика
Upload Pipeline: от загрузки до публикации
Этап 1: Загрузка видео
Видео на YouTube могут быть огромными — до 256 ГБ и 12 часов. Загрузка одним запросом невозможна.
Resumable Upload Protocol:
Шаг 1: Инициализация
POST /upload/youtube/v3/videos?uploadType=resumable
Content-Type: application/json
{ "title": "Мой влог", "description": "..." }
Ответ: 200 OK
Location: https://upload.youtube.com/upload/id/abc123
Шаг 2: Загрузка частями (chunks по 8-64 МБ)
PUT /upload/id/abc123
Content-Range: bytes 0-8388607/1073741824
[8 МБ данных]
PUT /upload/id/abc123
Content-Range: bytes 8388608-16777215/1073741824
[следующие 8 МБ]
Шаг 3: При разрыве — запрос статуса
PUT /upload/id/abc123
Content-Range: bytes */1073741824
Ответ: 308 Resume Incomplete
Range: bytes=0-67108863 ← загружено 64 МБ, продолжить с 64 МБ+1
Преимущества:
- Возобновляемость — разрыв на 90% не означает перезагрузку
- Прогресс — точный % процесса
- Параллельность — несколько частей одновременно (на клиенте)
Этап 2: Предварительная обработка
После загрузки, до транскодирования, видео проходит быструю проверку:
┌────────────┐ ┌───────────────────────────────────┐
│ Загруженное│ │ PRE-PROCESSING │
│ видео │────►│ │
│ (original) │ │ 1. Вирус-скан (malware) │
│ │ │ 2. Формат: поддерживаемый? │
│ │ │ (MP4, MOV, AVI, WebM, MKV...) │
│ │ │ 3. Copyright check (Content ID) │
│ │ │ 4. Извлечение метаданных: │
│ │ │ - длительность │
│ │ │ - кодек, битрейт │
│ │ │ - разрешение │
│ │ │ - аудио-треки │
│ │ │ 5. Генерация preview thumbnail │
│ │ │ │
└────────────┘ └────────────────┬──────────────────┘
│
▼
В очередь транскодирования
Этап 3: Транскодирование (Transcoding)
Это самый ресурсоёмкий этап. Одно видео перекодируется в ~10 вариантов:
Входной файл: original.mp4 (1080p, H.265, 10 мин, 700 МБ)
Выходные файлы:
┌──────────┬────────────┬─────────────┬──────────┬───────────────┐
│ Качество │ Разрешение │ Кодек │ Битрейт │ Размер (10мин)│
├──────────┼────────────┼─────────────┼──────────┼───────────────┤
│ 4K │ 3840×2160 │ VP9 / AV1 │ 20 Mbps │ 1.5 ГБ │
│ 1440p │ 2560×1440 │ VP9 / AV1 │ 10 Mbps │ 750 МБ │
│ 1080p │ 1920×1080 │ H.264 / VP9 │ 5 Mbps │ 375 МБ │
│ 720p │ 1280×720 │ H.264 / VP9 │ 2.5 Mbps │ 187 МБ │
│ 480p │ 854×480 │ H.264 │ 1 Mbps │ 75 МБ │
│ 360p │ 640×360 │ H.264 │ 0.5 Mbps │ 37 МБ │
│ 240p │ 426×240 │ H.264 │ 0.3 Mbps │ 22 МБ │
│ 144p │ 256×144 │ H.264 │ 0.1 Mbps │ 7.5 МБ │
│ Audio │ — │ AAC / Opus │ 128 kbps │ 9.6 МБ │
│ Audio │ — │ AAC / Opus │ 256 kbps │ 19.2 МБ │
└──────────┴────────────┴─────────────┴──────────┴───────────────┘
Итого: ~3 ГБ выходных файлов из 700 МБ входного
Параллельное транскодирование
Транскодирование 10-минутного видео в одном потоке занимает ~5-10 минут (в зависимости от кодека). Для 50 видео/сек это недопустимо.
┌─────────────────────────────────────────────────────────┐
│ PARALLEL TRANSCODING │
│ │
│ Видео разбивается на сегменты (chunks) по 4-10 сек: │
│ │
│ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ │
│ │Seg 1│ │Seg 2│ │Seg 3│ │Seg 4│ │Seg 5│ ... │
│ └──┬──┘ └──┬──┘ └──┬──┘ └──┬──┘ └──┬──┘ │
│ │ │ │ │ │ │
│ ▼ ▼ ▼ ▼ ▼ │
│ Worker1 Worker2 Worker3 Worker4 Worker5 │
│ (1080p) (1080p) (1080p) (1080p) (1080p) │
│ │ │ │ │ │ │
│ ▼ ▼ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────┐ │
│ │ STITCHER (склейка сегментов) │ │
│ │ → final_1080p.mp4 │ │
│ └─────────────────────────────────────────┘ │
│ │
│ Параллельно: то же для 720p, 480p, 360p, ... │
└─────────────────────────────────────────────────────────┘
DAG (Directed Acyclic Graph) Pipeline:
┌── 4K ──────── merge ──► 4K.mp4
├── 1440p ───── merge ──► 1440p.mp4
Original ── split ──┼── 1080p ───── merge ──► 1080p.mp4
├── 720p ────── merge ──► 720p.mp4
├── 480p ────── merge ──► 480p.mp4
├── 360p ────── merge ──► 360p.mp4
├── 240p ────── merge ──► 240p.mp4
├── 144p ────── merge ──► 144p.mp4
├── Audio AAC ────────── ► audio_aac.m4a
└── Audio Opus ───────── ► audio_opus.webm
Параллельно:
── Thumbnails (каждые 10 сек) ──► sprites
── Content ID (fingerprint) ──► copyright DB
── Auto-captions (Speech-to-Text) ──► .vtt subtitles
Приоритизация транскодирования
Не все качества одинаково важны. YouTube использует поэтапную публикацию:
Приоритет 1: 360p + 720p → публикация через ~2 мин
(покрытие мобильных и базовых зрителей)
Приоритет 2: 1080p + 480p → публикация через ~5 мин
(основная аудитория)
Приоритет 3: 1440p + 4K → публикация через ~15 мин
(энтузиасты)
Приоритет 4: AV1-кодек → публикация через часы
(более эффективное сжатие, но медленное кодирование)
Зритель видит «360p / 720p» сразу после загрузки, остальные качества появляются постепенно.
View Pipeline: доставка видео зрителям
Адаптивный стриминг (ABR)
YouTube использует DASH (Dynamic Adaptive Streaming over HTTP) — стандарт адаптивного стриминга:
Принцип работы DASH:
1. Видео разбито на сегменты по 2-5 секунд
2. Каждый сегмент доступен в нескольких качествах
3. Клиент выбирает качество для КАЖДОГО сегмента отдельно
Manifest (MPD — Media Presentation Description):
┌────────────────────────────────────────────────┐
│ Видео: "Мой влог" │
│ │
│ Качества: │
│ 1080p: segments/1080p/seg_001.m4s │
│ 720p: segments/720p/seg_001.m4s │
│ 480p: segments/480p/seg_001.m4s │
│ 360p: segments/360p/seg_001.m4s │
│ │
│ Длительность сегмента: 4 секунды │
│ Всего сегментов: 150 (10 мин видео) │
└────────────────────────────────────────────────┘
Пример адаптации:
Seg 1-10: 1080p (хороший интернет)
Seg 11-15: 720p (Wi-Fi стал хуже)
Seg 16-20: 480p (переключились на мобильный)
Seg 21+: 720p (сигнал восстановился)
ABR-алгоритм на клиенте
┌──────────────────────────────────────────────────────┐
│ ABR Algorithm │
│ Входные данные: │
│ - buffer_level: 12 сек │
│ - bandwidth_estimate: 8 Mbps │
│ - last_segment_download_time: 0.5 сек │
│ │
│ Логика: │
│ if buffer_level > 30 sec: │
│ → upgrade quality (запас буфера) │
│ elif buffer_level < 5 sec: │
│ → downgrade quality (опасность остановки) │
│ else: │
│ → выбрать максимальное качество, │
│ чтобы сегмент загрузился за < 80% его длины │
│ │
│ Пример: сегмент = 4 сек, скачать нужно за < 3.2с │
│ 1080p (5 Mbps × 4с ÷ 8 = 2.5 МБ) → 2.5 МБ / │
│ 8 Mbps = 0.31с ✓ │
│ 1440p (10 Mbps × 4с ÷ 8 = 5 МБ) → 5 МБ / │
│ 8 Mbps = 0.625с ✓ │
│ → Выбираем 1440p │
└──────────────────────────────────────────────────────┘
Глобальная CDN
YouTube использует Google Global Cache (GGC) — собственную CDN, встроенную непосредственно в сети провайдеров:
Традиционная CDN:
Зритель ——► ISP ——► Internet ——► CDN Edge (город) ——► Origin
Google Global Cache:
Зритель ——► ISP ◄══► GGC (сервер Google ВНУТРИ ISP)
│
│ (кеш 90%+ контента)
│ cache miss?
▼
Google Edge PoP ——► Origin
GGC-серверы размещены в 1000+ ISP по всему миру. Это означает:
- > 90% просмотров доставляются из кеша в пределах сети провайдера
- Минимальная задержка — данные не покидают сеть ISP
- Снижение трафика для провайдеров (win-win: провайдер экономит, YouTube экономит)
Кеширование на CDN
Стратегия кеширования:
HOT: Популярные видео (топ-10% по просмотрам)
→ Кешируются на ВСЕХ GGC-серверах
→ TTL: 24 часа
→ Занимают ~20% кеша, обслуживают ~80% трафика
WARM: Видео средней популярности
→ Кешируются на региональных Edge PoP
→ TTL: 7 дней
→ Cache miss → запрос к Origin
COLD: Редко просматриваемые видео (long tail)
→ НЕ кешируются на CDN
→ Запрос напрямую к Object Storage
→ Составляют ~80% каталога, но < 5% трафика
Metadata Service: каталог и социальные функции
Схема данных
┌──────────────────────────────────────────────────────────────┐
│ VIDEOS │
├──────────┬──────────┬──────────┬────────────┬────────────────┤
│ video_id │ title │ channel │ upload_date│ status │
│ (PK) │ │ _id │ │ (processing/ │
│ │ │ │ │ published/ │
│ │ │ │ │ blocked) │
├──────────┼──────────┼──────────┼────────────┼────────────────┤
│ views │ likes │ duration │ thumbnails │ captions │
│ (count) │ (count) │ (sec) │ (URLs) │ (URLs) │
└──────────┴──────────┴──────────┴────────────┴────────────────┘
┌──────────────────────────────────────────────────────────────┐
│ CHANNELS │
├──────────┬──────────┬───────────────┬────────────────────────┤
│ channel_id│ name │ subscribers │ total_views │
│ (PK) │ │ (count) │ │
└──────────┴──────────┴───────────────┴────────────────────────┘
┌──────────────────────────────────────────────────────────────┐
│ COMMENTS │
├──────────┬──────────┬──────────┬──────────────┬──────────────┤
│ video_id │ comment_id│ user_id │ text │ parent_id │
│ (PK) │ (SK) │ │ │ (для ответов)│
└──────────┴──────────┴──────────┴──────────────┴──────────────┘
Счётчики просмотров: проблема горячих записей
Популярное видео набирает миллионы просмотров в час. Если каждый просмотр — это UPDATE videos SET views = views + 1, база данных не выдержит.
Решение: Buffered / Approximate Counters
┌───────────────────────────────────────────────┐
│ VIEW COUNTER PIPELINE │
│ │
│ View Event ──► Kafka Topic "views" │
│ │ │
│ ▼ │
│ Stream Processor │
│ (Apache Flink / Dataflow) │
│ │ │
│ ┌───────┼────────┐ │
│ ▼ ▼ ▼ │
│ Window 1 Window 2 Window 3 │
│ (1 min) (1 min) (1 min) │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ +14 523 +12 891 +15 102 │
│ │ │
│ ▼ │
│ Batch UPDATE в DB каждые 1-5 минут │
│ (вместо миллионов отдельных UPDATE) │
└───────────────────────────────────────────────┘
YouTube отображает приблизительные счётчики (обновляются раз в минуту-час), а точные — в YouTube Studio (с задержкой часы-дни).
Рекомендательная система
Рекомендации — ключевой драйвер YouTube. Более 70% просмотров приходят из рекомендаций, а не из поиска.
Двухэтапная архитектура
┌──────────────────────────────────────────────────────────┐
│ RECOMMENDATION SYSTEM │
│ │
│ Этап 1: Candidate Generation (отбор кандидатов) │
│ ────────────────────────────────────────── │
│ Из каталога ~800 млн видео → отобрать ~1000 кандидатов │
│ │
│ Модели: │
│ - Collaborative Filtering (похожие пользователи) │
│ - Content-based (похожий контент) │
│ - Trending (популярное в регионе) │
│ - Subscriptions (новое от подписок) │
│ │
│ │ │
│ ▼ │
│ Этап 2: Ranking (ранжирование) │
│ ────────────────────────────────── │
│ Из ~1000 кандидатов → ранжировать → показать ~20-50 │
│ │
│ Признаки (features): │
│ - CTR prediction (вероятность клика) │
│ - Watch time prediction (сколько посмотрит) │
│ - Engagement (лайк, коммент, шер) │
│ - Freshness (новизна видео) │
│ - Diversity (разнообразие тем) │
│ - User history (что смотрел раньше) │
│ │
│ Модель: Deep Neural Network (DNN) │
│ Оптимизирует: ожидаемое watch_time × engagement │
│ │
│ Результат: отсортированный список для конкретного │
│ пользователя в конкретный момент │
└──────────────────────────────────────────────────────────┘
Инфраструктура ML
┌────────────────────────────────────────────┐
│ ML PIPELINE │
│ │
│ Training (оффлайн): │
│ - Данные: петабайты watch history │
│ - Модели: TensorFlow, обучение на TPU │
│ - Цикл обучения: ежедневно │
│ │
│ Serving (онлайн, real-time): │
│ - Модель загружена в GPU-инференс │
│ - Latency: < 50 мс на запрос │
│ - Throughput: ~1 млн запросов/сек │
│ │
│ Feature Store: │
│ - User features (история, подписки) │
│ - Video features (embedding, stats) │
│ - Context features (время, устройство) │
│ - Обновляются near-real-time │
└────────────────────────────────────────────┘
Поиск видео
YouTube Search — это комбинация текстового поиска (по заголовку, описанию, тегам) и ML-ранжирования.
Архитектура поиска
Запрос: "как приготовить борщ"
│
▼
┌─────────────────────────────────────┐
│ QUERY PROCESSING │
│ │
│ 1. Нормализация │
│ "КАК приготовить БОРЩ" │
│ → "как приготовить борщ" │
│ │
│ 2. Spell correction │
│ "как пригатовить борш" │
│ → "как приготовить борщ" │
│ │
│ 3. Query expansion │
│ → "борщ" + "рецепт" + "кулинария"│
│ │
│ 4. Intent detection │
│ → тип: how-to, кулинария │
└──────────┬──────────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ RETRIEVAL │
│ (Inverted Index) │
│ │
│ "борщ" → [vid_1, vid_5, vid_12...] │
│ "рецепт" → [vid_1, vid_3, vid_5..] │
│ │
│ Intersection → [vid_1, vid_5, ...] │
│ → ~5000 кандидатов │
└──────────┬──────────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ RANKING │
│ │
│ Для каждого кандидата: │
│ - Relevance score │
│ (BM25 + embedding)│
│ - Quality score (watch time, CTR)│
│ - Freshness bonus │
│ - Channel authority │
│ │
│ → Топ 20 результатов │
└─────────────────────────────────────┘
Content Moderation: Content ID
Content ID — система YouTube для обнаружения нарушения авторских прав.
┌──────────────────────────────────────────────────────────┐
│ CONTENT ID │
│ │
│ При загрузке: │
│ 1. Видео → Audio fingerprint (аудио-отпечаток) │
│ 2. Видео → Visual fingerprint (визуальный отпечаток) │
│ │
│ Сравнение с базой Reference Files: │
│ ~100 млн+ reference файлов от правообладателей │
│ │
│ Результат: │
│ ├─ Совпадение 0% → разрешено │
│ ├─ Совпадение 30-60% → на ручную проверку │
│ └─ Совпадение 80%+ → действие правообладателя: │
│ ├─ Block: видео недоступно │
│ ├─ Monetize: реклама, доход правообладателю │
│ └─ Track: только статистика │
└──────────────────────────────────────────────────────────┘
Live Streaming
YouTube поддерживает прямые трансляции с задержкой 3-30 секунд.
Архитектура Live
┌──────────────┐ RTMP/SRT ┌───────────────────┐
│ Стример │─────────────►│ Ingest Server │
│ (OBS/Camera)│ │ (ближайший PoP) │
└──────────────┘ └────────┬──────────┘
│
▼
┌───────────────────┐
│ Live Transcoder │
│ (real-time FFmpeg)│
│ │
│ 1080p, 720p, 480p │
│ + Low-latency HLS │
└────────┬──────────┘
│
▼
┌───────────────────┐
│ Edge Cache / CDN │
│ │
│ HLS segments │
│ (2-6 сек каждый) │
└────────┬──────────┘
│
▼
Зрители
(HLS player)
Live Chat
Чат live-трансляции — отдельная система (аналогично Twitch):
┌────────────────────────────────────────────┐
│ LIVE CHAT │
│ │
│ WebSocket ──► Chat Service │
│ │ │
│ ├─ Anti-spam filter │
│ ├─ Rate limiting (3 msg/5s) │
│ ├─ Moderation (ML + rules) │
│ │ │
│ ▼ │
│ Broadcast to viewers (fan-out): │
│ - Группировка: batches по 50 сообщений │
│ - Отправка batch каждые 1 сек │
│ - При > 10K viewers: sampling │
│ (зрители видят ~30% сообщений) │
└────────────────────────────────────────────┘
Монетизация и реклама
Рекламный pipeline
┌──────────────┐ ┌───────────────────────┐
│ Зритель │ Запрос │ Ad Decision Engine │
│ нажимает │ видео │ │
│ Play │─────────────►│ 1. User profile │
│ │ │ 2. Video context │
│ │ │ 3. Ad auction (RTB) │
│ │ │ 4. Ad selection │
│ │ │ │
│ │◄─────────────│ → Pre-roll ad (5-15s)│
│ │ Реклама │ → Mid-roll ad (8min+)│
│ │ │ → Post-roll ad │
└──────────────┘ └───────────────────────┘
Ad Auction (Real-Time Bidding):
Рекламодатель A: bid $0.05 CPV, targeting: "кулинария, 25-34"
Рекламодатель B: bid $0.03 CPV, targeting: "кулинария"
Рекламодатель C: bid $0.08 CPV, targeting: "еда, Москва"
→ Побеждает C ($0.08), платит$0.03+$0.01 =$0.04 (second-price auction)
Масштабирование
Шардирование базы метаданных
Videos: шардируется по video_id (consistent hashing)
Comments: шардируется по video_id (все комменты видео на одном шарде)
Users: шардируется по user_id
Subscriptions: шардируется по subscriber_id
Горячие видео: реплицируются на read-replicas
Очереди и асинхронная обработка
┌─────────────────────────────────────────────┐
│ EVENT BUS (Kafka / Pub/Sub) │
│ │
│ Topics: │
│ - video.uploaded → Transcoding │
│ - video.published → Search indexing │
│ - video.viewed → Analytics │
│ - comment.created → Spam detection │
│ - video.reported → Moderation queue │
│ - subscription.new → Notification │
└─────────────────────────────────────────────┘
Итого: ключевые решения
| Решение | Выбор | Обоснование |
|---|---|---|
| Загрузка | Resumable chunked upload | Файлы до 256 ГБ, ненадёжные соединения |
| Транскодирование | Параллельные сегменты, DAG pipeline | Скорость обработки: 50 видео/сек |
| Хранилище | Colossus + GCS (объектный storage) | Экзабайты данных |
| Стриминг | DASH (HLS для iOS) | Адаптивный битрейт |
| CDN | Google Global Cache (внутри ISP) | < 200 мс TTFB, 90%+ cache hit |
| Рекомендации | Two-stage: candidates → ranking (DNN) | 70% просмотров из рекомендаций |
| Поиск | Inverted index + ML ranking | Семантический поиск по 800 млн видео |
| Счётчики | Buffered counters / Flink | Миллионы views/sec без hot spots |
| Модерация | Content ID (audio/visual fingerprint) | 100 млн+ reference files |
| Live | RTMP ingestion → LL-HLS → CDN | Задержка 3-15 сек |
Типичные вопросы на интервью
Q: Как YouTube обрабатывает 500 часов видео в минуту? A: Параллельное транскодирование — видео разбивается на сегменты, каждый сегмент обрабатывается отдельным worker-ом. ~10 качеств обрабатываются параллельно. Приоритизация: 360p/720p публикуются первыми.
Q: Как отображать точный счётчик просмотров при миллионах views/sec? A: Не отображаем точный в реальном времени. Views буферизуются в Kafka → обрабатываются stream processor → batch update в DB раз в минуту. Публичный счётчик — приблизительный.
Q: Почему CDN внутри ISP, а не традиционные Edge PoP? A: 90%+ cache hit rate. Трафик не покидает сеть провайдера → минимальная задержка. Win-win: провайдер экономит на межсетевом трафике, YouTube снижает расходы на bandwidth.
Q: Как работает адаптивный битрейт? A: DASH — видео нарезано на 2-5 сек сегменты, каждый доступен в 8+ качествах. ABR-алгоритм на клиенте выбирает качество каждого сегмента на основе bandwidth и уровня буфера.
Q: Как работают рекомендации? A: Два этапа. Candidate generation: из 800 млн видео отбирается ~1000 кандидатов (collaborative/content/trending). Ranking: DNN ранжирует кандидатов по predicted watch_time × engagement.