Как создать архитектуру YouTube с Kafka, S3 и адаптивным стримингом

freeCodeCamp.org 152 тыс. 1 ч 25 мин 5 мин 11.06.2024
Главное

Эта статья основана на курсе Кирти Пурвани (Keerti Purwani), опубликованном на канале freeCodeCamp.org. В ней подробно разбирается процесс создания архитектуры видеоплатформы уровня YouTube с нуля, включая вопросы загрузки, транскодирования и адаптивного стриминга.

📺 Эволюция пет-проектов: почему обычные клоны больше не работают 0:00

Современный рынок разработки ПО стал чрезвычайно конкурентным. По мнению автора курса Кирти Пурвани, создание простых веб-приложений или визуальных клонов известных сервисов больше не впечатляет работодателей . Сегодня от инженера ожидают понимания принципов системного проектирования (High-Level Design, HLD). Данный проект — это не просто интерфейс YouTube, а полноценная распределенная система, включающая:

Кирти утверждает, что весь код был написан в рамках живых сессий общей длительностью около 6 часов, где каждая строка объяснялась студентам минимум дважды .

🏗️ Первый этап: ядро системы и клиентская часть 4:38

Проектирование начинается не с архитектуры, а с реализации базовых функций. Кирти рекомендует начинающим разработчикам сначала сфокусироваться на трех столпах: загрузке (upload), просмотре (watch) и преобразовании (transcode) .

Для реализации видеоплеера на стороне клиента (Next.js) используется библиотека react-player . На первом этапе система учится трем вещам:

  1. Воспроизведению любого внешнего URL с YouTube .
  2. Стримингу собственного видео и аудио пользователя (аналог функционала Zoom) .
  3. Воспроизведению файлов напрямую из публичного бакета S3 .

Затем создается Upload Service на Node.js . Изначально это простейший API, который принимает файл и отправляет его в облако S3. Автор подчеркивает важность поэтапного усложнения: сначала загружается обычная PNG-картинка, затем маленькое видео, и только потом система переходит к обработке тяжелого контента .

🔐 Аутентификация и безопасность 13:00

Безопасность системы реализована через протокол OAuth с использованием библиотеки NextAuth.js . Выбор пал на авторизацию через Google, так как это стандарт для современных платформ.

Ключевые технические детали:

📨 Внедрение Apache Kafka и принципов HLD 15:11

Когда базовый поток «клиент — сервер — S3» отлажен, Кирти вводит концепции High-Level Design. Прямая загрузка видео неэффективна, так как после получения файла система должна выполнить множество ресурсозатратных задач: фильтрацию контента на запрещенные материалы, проверку авторских прав и, самое главное, транскодирование в разные разрешения (1080p, 720p и т.д.) .

Для решения этой задачи используется паттерн Pub-Sub (Publisher-Subscriber) на базе Kafka :

Автор использовала облачное решение Aiven для развертывания Kafka и PostgreSQL, отмечая его удобство для обучения .

📦 Чанкинг и Multipart Upload в S3 20:15

Загрузка 10-гигабайтного файла одним куском практически невозможна из-за ограничений сети и высокого риска сбоев. Решением является чанкинг — разделение видео на мелкие части (чанки) .

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

Для сборки видео на стороне S3 используется механизм Multipart Upload, состоящий из трех этапов :

  1. Initiation: Запрос на начало загрузки, получение uploadID .
  2. Parts Upload: Параллельная отправка кусков. За каждую часть S3 возвращает eTag (уникальный идентификатор части) .
  3. Completion: Отправка массива всех eTag и partNumber. После этого S3 автоматически «склеивает» видео в один файл .

📈 Балансировка и параллелизм 37:17

Для оптимизации загрузки Кирти использует массив промисов в JavaScript. Вместо того чтобы ждать завершения загрузки каждого чанка по очереди (await внутри цикла), клиент отправляет все части сразу, а затем ожидает их завершения через Promise.all . Это создает нагрузку на бэкенд, но при наличии балансировщика нагрузки (Load Balancer) позволяет достичь максимальной пропускной способности канала .

🗄️ Watch Service и работа с метаданными 39:15

Когда видео оказывается в S3, данные о нем должны быть доступны для поиска и отображения. Для этого создается Watch Service и база данных PostgreSQL.

В качестве ORM используется Prisma . Процесс выглядит так:

Кирти упоминает технологию Vitess, которую YouTube использует для горизонтального масштабирования MySQL, но в рамках учебного проекта ограничивается классической PostgreSQL .

🔄 Адаптивный стриминг (HLS) и транскодирование 59:00

Самая сложная часть проекта — реализация Adaptive Bitrate Streaming. Это технология, позволяющая видеоплееру автоматически менять качество видео (например, с 1080p на 480p) при ухудшении интернет-соединения .

Для реализации используется протокол HLS (HTTP Live Streaming) от Apple . Суть процесса:

  1. FFMPEG: Программное обеспечение, которое перекодирует исходное видео в несколько разрешений (320p, 480p, 720p) одновременно .
  2. Сегментация: Каждое видео режется на 10-секундные кусочки с расширением .ts .
  3. Манифест (.m3u8): Текстовый файл-плейлист, который содержит ссылки на все сегменты. Создается «мастер-плейлист», который указывает плееру, какие файлы соответствуют какому разрешению .

🛠️ Модель «S3 to S3» 1:17:46

Финальная схема работы Transcoder Service выглядит так:

🏁 Резюме архитектуры (HLD Diagram) 1:21:43

В завершение Кирти сводит все компоненты в единую диаграмму:

  1. Клиент (Next.js) инициирует загрузку чанками.
  2. Upload Service управляет Multipart Upload в S3, пишет метаданные в PostgreSQL и кидает задачу в Kafka.
  3. Transcoder Service забирает задачу, скачивает видео, дробит его на сегменты для разных разрешений через FFMPEG и возвращает результат в S3.
  4. Watch Service отдает клиенту ссылки на HLS-манифесты из базы данных.

По словам автора, реализация такой системы дает инженеру «не просто проект для портфолио, а глубокое понимание того, как работают высоконагруженные платформы в реальности» .

💬 Цитаты

«Просто клонированные проекты больше не работают. От вас ожидают умения говорить о системном дизайне.»

Кирти Пурвани 01:08

«Правильный ответ — вы должны делать чанкинг на стороне фронтенда.»

Кирти Пурвани 21:20
👥 Спикер
🔗 Упомянутые сайты и проекты
📖 Термины
Чанкинг
Процесс разделения большого файла на мелкие части для стабильной передачи по сети.
HLS (HTTP Live Streaming)
Протокол адаптивного вещания, который делит видео на сегменты и позволяет менять качество на лету.
Транскодирование
Преобразование видеофайла из одного формата или разрешения в другое.
Манифест (.m3u8)
Текстовый файл со списком сегментов видео и доступных разрешений для плеера.
📊 Цифры
🗓 Хронология
  1. 1-я неделя Реализация базовой загрузки, чанкинга и интеграции с S3.
  2. 2-я неделя Внедрение Kafka, транскодирования видео и адаптивного стриминга.
⚖️ Другая сторона
Инженерия System Design Apache Kafka Next.js FFMPEG Amazon S3