Граф знанийНастройки

Обновлено: 11 апреля 2026 г. в 23:51

Лента видеохостинга

средний

Публичное интервью на C++ Russia 2022: приём видео, транскодирование, доставка роликов через CDN и стратегия публикации в ленты подписчиков.

Видеохостинг ломается не на экране плеера, а там, где нужно принять огромный поток загрузок, пережить тяжёлую обработку и потом многократно дешевле отдать тот же ролик миллионам зрителей.

Глава помогает собрать в одну систему приём видео, очередь транскодирования, хранение исходных и готовых файлов, публикацию в ленты и доставку через CDN.

В интервью и инженерных обсуждениях этот кейс полезен тем, что заставляет отдельно объяснить тяжёлый путь записи, горячий путь чтения, стратегию раздачи в ленты и цену медиатрафика.

Тяжёлый путь записи

Загрузка, проверка и обработка ролика не должны тормозить публикацию и не должны мешать пути просмотра, который живёт по совсем другому профилю нагрузки.

Очередь транскодирования

Асинхронная обработка нужна, чтобы растянуть CPU-нагрузку по времени, переживать всплески загрузок и отдельно масштабировать воркеры.

Горячий путь чтения

Лента, метаданные и доставка сегментов обязаны отвечать быстро даже тогда, когда свежий ролик внезапно становится массовым.

Цена медиатрафика

Основные расходы рождаются не только в дисках, но и в сетевой выдаче, прогреве кэша, количестве вариантов качества и повторных чтениях из исходного хранилища.

Публичное интервью на C++ Russia 2022 хорошо показывает, почему видеохостинг сложен не только из-за плеера. Система должна принять пользовательский ролик, запустить , быстро обновить ленты и затем отдать тот же контент миллионам зрителей через .

Запись интервью

Полная запись публичного интервью доступна на YouTube. Она полезна тем, что показывает не только финальную схему, но и сам ход архитектурного обсуждения.

Смотреть на YouTube

Постановка задачи

Лента видеохостинга

Нужно спроектировать сервис, в котором авторы загружают видео, а зрители смотрят их в хронологической ленте и переключают качество воспроизведения.

При таком масштабе важны не только функции продукта, но и , и . Иначе система упрётся либо во время публикации ролика, либо в стоимость его выдачи.

Функциональные

Загрузка видео авторами без долгого ожидания на клиенте.

Публикация ролика в лентах подписчиков после завершения обработки.

Выбор качества воспроизведения от 360p до 1080p.

Хронологическая лента с базовой сортировкой по времени публикации.

Нефункциональные

Доступность: высокая

Просмотр и загрузка должны оставаться рабочими даже при частичных сбоях.

Масштабируемость: горизонтальная

Система должна расти вместе с объёмом контента и числом зрителей.

Устойчивость к отказам: обязательная

Потеря отдельного узла не должна приводить к потере видео или остановке выдачи.

Экономика системы: под контролем

Нужно эффективно расходовать вычисления, хранилище и сетевую выдачу.

Оценка нагрузки (Back of the Envelope)

DAU (Daily Active Users)10 млн
Просмотров в день100 млн
Загрузок видео в день1 млн (~12 RPS)
Запросов к ленте в день50 млн (~580 RPS)
Рост хранилища в день~300 ТБ

Ключевой вывод: здесь доминирует не число запросов, а объём хранения и сетевой выдачи. Поэтому экономику системы определяют количество вариантов качества, стратегия кэширования и стоимость медиатрафика.

Высокоуровневая архитектура

Архитектура разделяет — приём файла, проверку и обработку — и — сборку ленты, выдачу метаданных и воспроизведение.

Видеохостинг: общая схема

загрузка, обработка, ленты и выдача видео

Контур загрузки и обработки

Автор
загрузка ролика
Шлюз API
доступ и маршрутизация
API загрузки
приём исходного файла
Очередь обработки
задачи транскодирования
Воркеры видео
варианты HLS/DASH

Хранилище и выдача

Исходное хранилище
файлы и сегменты
Хранилище метаданных
состояние ролика и манифест
Хранилище лент
персональные выдачи
Зритель -> API ленты -> CDN
основной путь воспроизведения
Схема показывает, как приём файла, обработка, хранение метаданных и выдача видео разведены по разным контурам.

Контур загрузки и обработки можно масштабировать независимо от контура просмотра. Это позволяет отдельно наращивать число воркеров, объём кэша и пропускную способность выдачи.

Путь записи и путь чтения

Разбор пути записи и пути чтения

Переключайте сценарий и проигрывайте шаги по очереди.

1
Автор
загружает ролик
2
API загрузки
проверка и временное хранение
3
Очередь и воркеры
транскодирование
4
Исходное хранилище и метаданные
файлы и манифест
5
Обновление лент
раздача и уведомление
Путь записи: нажмите «Старт», чтобы пройти путь от загрузки ролика до публикации в лентах.

Путь записи: ключевые шаги

  • Создатель загружает исходный файл, а API возвращает `video_id` и статус обработки.
  • Видео разбивается на отдельные задачи; воркеры готовят варианты качества 360p, 480p, 720p и 1080p.
  • Готовые файлы и сегменты сохраняются в исходном хранилище, а статус публикации обновляется в метаданных.
  • После перехода в статус `ready` сервис обновляет ленты подписчиков и отправляет событие о готовности ролика.

Путь чтения: ключевые шаги

  • Пользователь открывает ленту, и сервис возвращает список `video_id` по подпискам и персональным сигналам.
  • Сервис метаданных отдает HLS/DASH-манифест и список доступных вариантов качества.
  • CDN чаще всего выдает сегменты из ближайшего к пользователю кэша.
  • Если сегмента нет в кэше, CDN забирает его из исходного хранилища и сразу прогревает локальную точку выдачи.

Ключевые компоненты

Критические узлы здесь — для тяжёлых задач, для промежуточных и готовых файлов, для сегментов и в метаданных, который нужен плееру для старта.

API загрузки

Принимает бинарные файлы от авторов, проверяет лимиты и кладёт исходный ролик во временное хранилище.

POST /v1/videos → {video_id, upload_url}

Очередь задач транскодирования

RabbitMQ или аналог распределяет тяжёлую обработку по воркерам. Одна загрузка порождает несколько задач — по одной на каждое разрешение.

360p
480p
720p
1080p

Воркеры обработки видео

Это воркеры без локального состояния, которые читают задачи из очереди, запускают FFmpeg, собирают варианты качества и легко масштабируются горизонтально под всплеск загрузок.

Хранилище бинарных объектов

S3-совместимое хранилище вроде MinIO или Ceph хранит исходные ролики, готовые файлы и сегменты. Обычно его делят на временный и постоянный контуры.

Временное хранилищеПостоянное хранилище

Хранилище лент

Документная NoSQL-база вроде MongoDB или Cassandra хранит предрассчитанные ленты. Обычно данные шардиются по user_id, а сама лента представляет собой массив ID видео в порядке публикации.

CDN

CDN держит популярные сегменты ближе к зрителю и снимает нагрузку с исходного слоя хранения. Это снижает старта воспроизведения и защищает исходное хранилище от резких всплесков трафика.

Модели данных

Метаданные видео

{
  "id": "uuid",
  "author_id": "user_123",
  "title": "My Video",
  "description": "...",
  "created_at": "2024-03-15T10:00:00Z",
  "status": "ready",
  "versions": {
    "360p": "s3://videos/uuid/360p.mp4",
    "480p": "s3://videos/uuid/480p.mp4",
    "720p": "s3://videos/uuid/720p.mp4",
    "1080p": "s3://videos/uuid/1080p.mp4"
  }
}

Лента пользователя

{
  "user_id": "user_456",
  "feed": [
    "video_id_1",
    "video_id_2",
    "video_id_3",
    ...
  ],
  "last_updated": "2024-03-15T12:00:00Z"
}

Предрассчитанная лента хранит только ID роликов и время последнего обновления, поэтому её дёшево читать и несложно перестраивать.

Стратегии доставки в ленты

Главный продуктовый компромисс здесь — где выполнять : в момент публикации ролика или в момент чтения ленты.

Раздача при записи (push)

При публикации ролика система сразу добавляет его в ленты подписчиков.

Быстрое чтение ленты
Дорогая публикация для авторов с миллионами подписчиков

Сборка при чтении (pull)

Лента собирается по запросу из последних роликов по всем подпискам.

Простая публикация ролика
Более дорогой и медленный путь чтения

Гибридный подход

Для обычных авторов выгоднее push: он удешевляет чтение. Для очень популярных авторов лучше переключаться на pull или смешанную схему, чтобы не перегружать публикацию миллионами обновлений в момент выхода ролика.

Инфраструктурные сервисы

Балансировщик L4/L7

Распределяет трафик между внешними API и сервисами выдачи.

Обнаружение сервисов

Помогает находить доступные экземпляры сервисов через Consul или etcd.

Автомасштабирование

Увеличивает или уменьшает число воркеров под фактическую нагрузку.

Мониторинг

Собирает метрики, алерты и логи через Prometheus, Grafana и похожие инструменты.

Ограничение скорости

Защищает систему от злоупотреблений и DDoS-атак.

Размыкатель цепи

Включает мягкую деградацию, когда зависимость начинает отвечать нестабильно.

Ключевые выводы из интервью

1

Разделяйте запись и чтение

Приём и обработка ролика растут по одним законам, а выдача ленты и сегментов — по другим. Эти контуры лучше проектировать и масштабировать отдельно.

2

Тяжёлые операции отправляйте в очередь

Транскодирование не должно жить в пользовательском запросе. Асинхронная обработка позволяет контролировать нагрузку и отдельно масштабировать воркеры.

3

CDN обязателен для медиатрафика

При сотнях терабайт нового контента в день без глобального кэша система быстро упрётся в стоимость выдачи и перегрузит исходное хранилище.

4

Предрассчитывайте то, что читают чаще всего

Готовая лента почти всегда дешевле и быстрее, чем сборка на лету из множества источников при каждом открытии приложения.

Связанные главы

Чтобы отмечать прохождение, включи трекинг в Настройки