YouTube
YouTube system design
YouTube — это популярный видеостриминговый сервис, где пользователи загружают, стримят, ищут, комментируют, делятся и ставят лайки или дизлайки видео. Крупные компании, а также частные лица ведут каналы, на которых размещают свои видео. YouTube позволяет бесплатно размещать видеоконтент, который можно делиться с пользователями по всему миру. YouTube считается основным источником развлечений, особенно среди молодежи, и, по данным Wikipedia на 2022 год, он занимает второе место по количеству просмотров после Google.

Популярность YouTube
Некоторые из причин, по которым YouTube набрал популярность за эти годы, включают следующие:
- Простота: YouTube имеет простой, но мощный интерфейс.
- Богатый контент: Благодаря простому интерфейсу и бесплатному хостингу, YouTube привлек большое количество создателей контента.
- Постоянное улучшение: Команда разработчиков YouTube непрерывно работала над тем, чтобы удовлетворить требования к масштабируемости со временем. Кроме того, Google приобрел YouTube в 2007 году, что повысило его авторитет.
- Источник дохода: YouTube разработал партнерскую программу, которая позволяет создателям контента зарабатывать деньги на своем вирусном контенте.
Кроме вышеперечисленных причин, YouTube также сотрудничал с крупными игроками рынка, такими как CNN и NBC, чтобы укрепить свои позиции.
Рост YouTube
Рассмотрим несколько интересных статистических данных о YouTube и его популярности.
С момента своего основания в феврале 2005 года количество пользователей YouTube увеличилось многократно. На данный момент насчитывается более 2,5 миллиардов активных пользователей YouTube ежемесячно. Давайте взглянем на график ниже, чтобы увидеть, как количество пользователей YouTube увеличивалось за последнее десятилетие.
https://www.statista.com/statistics/195140/new-user-generated-content-uploaded-by-users-per-minute/
Let’s evaluate your understanding of the building blocks required in the design of YouTube. Based on the functional and nonfunctional requirements given below, identify three key building blocks needed to curate the design of YouTube.
Functional requirements
- Stream videos
- Upload videos
- Search videos according to titles
- Like and dislike videos
- Add comments to videos
- View thumbnails
Nonfunctional requirements
- High availability
- Scalability
- Good performance
The three key building blocks required to design a system like YouTube are
- Databases, which are essential for storing metadata of videos, thumbnails, comments, and user information.
- Blob storage, crucial for holding all the videos on the platform.
- A Content Delivery Network (CDN), which is vital for efficiently delivering content to end users, minimizing delays and reducing the load on the primary servers.
Как мы будем проектировать YouTube?
Мы разделили проектирование YouTube на пять уроков:
-
Требования: Здесь мы определяем функциональные и нефункциональные требования. Мы также оцениваем ресурсы, необходимые для обслуживания миллионов пользователей каждый день. Этот урок отвечает на такие вопросы, как: сколько места для хранения потр ебуется YouTube, чтобы сохранить 500 часов видеоконтента, загружаемого на платформу каждую минуту.
-
Проектирование: В этом уроке мы объясняем, как будем проектировать сервис YouTube. Мы также кратко рассматриваем дизайн API и схемы баз данных. Наконец, мы кратко рассмотрим, как работает поиск на YouTube.
-
Оценка: Этот урок объясняет, как YouTube может выполнить все требования через предложенный дизайн. Мы также рассмотрим, как масштабирование в будущем может повлиять на систему и какие решения потребуются для решения проблем масштабирования.
-
Реальность сложнее: В этом уроке мы исследуем различные техники, которые YouTube использует для эффективной доставки контента клиентам и избежания перегрузок сети.
-
Викторина: Мы закрепляем основные концепции, которые мы изучили при проектировании YouTube, рассматривая, как мы могли бы спроектировать систему Netflix.
Наше обсуждение использования различных строительных блоков в дизайне будет ограничено, так как мы уже подробно рассмотрели их в главе о строительных блоках.
Requirements of YouTube's Design
Требования
Начнем с требований для проектирования системы, подобной YouTube.
Функциональные требования
Система должна обеспечивать следующие функции:
- Стриминг видео
- Загрузка видео
- Поиск видео по заголовкам
- Возможность ставить лайки и дизлайки видео
- Добавление комментариев к видео
- Просмотр миниатюр (thumbnails)
Нефункциональные требования
Также важно, чтобы наша система соответствовала следующим требованиям:
- Высокая доступность: Система должна быть высокодоступной. Высокая доступность требует хорошего процента времени работы. В общем, время работы 99% и выше считается хорошим.
- Масштабируемость: По мере роста числа пользователей такие аспекты, как хранилище для загрузки контента, требуемая пропускная способность для одновременного просмотра и количество одновременных запросов пользователей не должны становиться узкими местами, перегружающими наше приложение или веб-сервер.
- Хорошая производительность: Плавный опыт стриминга приводит к общей лучшей производительности.
- Надежность: Контент, загруженный в систему, не должен быть утерян или поврежден.
Нам не требуется строгая согласованность данных в дизайне YouTube. Например, если автор загружает видео, не все подписчики канала должны сразу же получить уведомление о загруженном контенте.
Вкратце, функциональные требования — это функции и возможности, которые получит пользователь, тогда как нефункциональные требования — это ожидания от системы с точки зрения производительности.
Исходя из требований, мы оценим необходимые ресурсы и разработаем дизайн нашей системы.
Оценка ресурсов
Оценка требует идентификации важных ресурсов, которые будут необходимы в системе.
Сотни минут видеоконтента загружаются на YouTube каждую минуту. Также большое количество пользователей будет одновременно стримить контент, что означает, что потребуются следующие ресурсы:
- Ресурсы для хранения, чтобы сохранить загруженный и обработанный контент.
- Большое количество запросов можно обрабатывать путем параллельной обработки. Это означает, что веб/приложение-серверы должны быть готовы обслуживать этих пользователей.
- Для обслуживания миллионов пользователей потребуется как пропускная способность загрузки, так и скачивания.
Чтобы перевести вышеуказанные ресурсы в реальные числа, примем следующие допущения:
- Общее количество пользователей YouTube: 1.5 миллиарда.
- Активные ежедневные пользователи (те, кто смотрит или загружает видео): 500 миллионов.
- Средняя продолжительность видео: 5 минут.
- Размер среднего (5-минутного) видео до обработки/кодирования (сжатие, изменение формата и так далее): 600 МБ.
- Размер среднего видео после кодирования (с использованием различных алгоритмов для разных разрешений, таких как MPEG-4 и VP9): 30 МБ.
Оценка объема хранилища
Чтобы оценить потребности YouTube в хранении данных, нам нужно оценить общее количество видео и продолжительность каждого видео, загружаемого на YouTube каждую минуту. Предположим, что на YouTube загружается контент длительностью 500 часов за одну минуту. Поскольку каждое видео размером 30 МБ имеет продолжительность 5 минут, нам требуется 30/5 = 6 МБ для хранения 1 минуты видео.
Представим это в виде формулы, приняв следующие допущения:

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

Примечание: В реальном мире дизайн YouTube требует хранилища для миниатюр, данных пользователей, метаданных видео, информации о каналах пользователей и так далее. Поскольку требуемый объем хранилища для этих наборов данных не будет значительным по сравнению с видеофайлами, для упрощения мы его игнорируем.
Assuming YouTube stores videos in five different qualities and the average size of a one-minute video is 6 MB, what would the estimated storage requirements per minute be?
Details

Оценка пропускной способности
Для стриминга и загрузки видео на YouTube потребуется большой объем передачи данных. Поэтому нам нужно также рассчитать нашу оценку пропускной способности. Предположим, что соотношение загрузок к просмотрам составляет 1:300 — то есть на каждое загруженное видео приходится 300 просмотров в секунду. Нам также нужно помнить, что при загрузке видео оно не находится в сжатом формате, в то время как просматриваемые видео могут быть разных качеств. Давайте оценим пропускную способность, необходимую для загрузки видео.

If 480 Gbps of bandwidth is required to satisfy uploading needs, how much bandwidth would be required to stream videos? Assume each minute of video requires 10 MB of bandwidth on average.
Hint: The upload:view ratio is provided.
Details


Оценка количества серверов
Предположим, что у нас есть 500 миллионов активных пользователей YouTube ежедневно. Учитывая наше предположение о использовании ежедневных активных пользователей в качестве прокси для количества запросов в секунду, чтобы определить количество серверов для пиковых нагрузок, мы получаем 500 миллионов запросов в секунду. Затем мы используем следующую формулу для расчета количества серверов:
Примечание: Одновременные запросы значительно влияют на количество необходимых серверов по сравнению с запросами, распределенными по времени. Для более детального изучения уточнения предположений о пиковых нагрузках обратитесь к главе «Приблизительные вычисления» (Back-of-the-envelope Calculations).

Design of YouTube
Высокоуровневое проектирование
Высокоуровневое проектирование показывает, как мы будем соединять различные компоненты, которые мы определили в предыдущем уроке. Мы начали разрабатывать решение, которое поддерживает функциональные и нефункциональные требования с помощью этого дизайна.

Рабочий процесс абстрактного дизайна выглядит следующим образом:
- Пользователь загружает видео на сервер.
- Сервер сохраняет метаданные и данные пользователя в базе данных и одновременно передает видео кодировщику для кодирования (см. 2.1 и 2.2 на иллюстрации выше).
- Кодировщик вместе с транскодером сжимает видео и преобразует его в н есколько разрешений (например, 2160p, 1440p, 1080p и так далее). Видео сохраняются в хранилище блобов (похожее на GFS или S3).
- Некоторые популярные видео могут быть переданы на CDN, который действует как кэш.
- CDN, благодаря своей близости к пользователю, позволяет пользователю стримить видео с низкой задержкой. Однако CDN не является единственной инфраструктурой для доставки видео конечному пользователю, как мы увидим в детализированном проектировании.
Why don’t we upload the video directly to the encoder instead of to the server? Doesn’t the current strategy introduce an additional delay?
Details
There are several reasons why it’s a good idea to introduce a server in between the encoder and the client:
- The client could be malicious and could abuse the encoder.
- If the uploaded video is a duplicate, the server could filter it out.
- Encoders will be available on a private IP address within YouTube’s network and not available for public access.
Проектирование API
Давайте разберемся с дизайном API с точки зрения функций, которые мы предоставляем. Мы разр аботаем API для перевода нашего набора функций в технические спецификации. В этом случае для простоты и скорости могут быть использованы REST API. Раздел проектирования API поможет нам понять, как клиент будет запрашивать услуги у бэкэнд-приложения YouTube. Давайте разработаем API для каждой из следующих функций:
- Загрузка видео
- Стриминг видео
- Поиск видео
- Просмотр миниатюр (thumbnails)
- Лайк или дизлайк видео
- Комментирование видео
