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

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

ШАГ 1: Сбор требований

  • Прочитайте вопрос еще раз
  • Понять проблему собрать требования?

В чем фокус этой системы масштабируемость, удобство использования
Масштаб системы (количество подписанных пользователей)
Хранение данных Сколько места нужно (пример: instagram)

Мы разрабатываем систему, которая позволяет пользователю транслировать контент с веб-сайта Netflix.

Список того, что происходит за кулисами на сайте Netflix

  1. Видеорекомендации
  2. Запись потока кликов
  3. Управление видеоконтентом
  4. система доставки видеоконтента
  5. Обработка данных об активности пользователя

Вопросы, которые следует задать при сборе информации:

Q: Что пользователь может делать на веб-сайте

В: Являются ли события, происходящие за кулисами, выходящими за рамки данного упражнения?

В: включен ли поиск видео в объем

В: Каков ожидаемый масштаб системы?

В. Добавление новых видео на веб-сайт выходит за рамки

ШАГ 2: План решения

На этом этапе мы разделяем большую проблему на более мелкие задачи.

Перечислите, что пользователь может делать на веб-сайте Netflix.

  1. Пользователи могут искать видео
  2. Пользователи могут просматривать описание видео
  3. Воспроизвести видео
  4. Иметь несколько видео, просмотренных наполовину
  5. Пользователь может оценить видео

Функциональные требования:

  • Пользователь может просматривать/искать видео
  • Пользователь может просматривать экран видеотрейлера
  • Пользователь может оценивать видео

Нефункциональные требования

  • Сайт должен быть высокодоступным
  • Сайт должен быть в состоянии доставлять контент максимально быстро

ШАГ 3: Расчет обратной стороны конверта

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

Решение для хранения видеоконтента:

Предположения:

Общее количество пользователей Netflix: 200 миллионов

Общий контент netflix: 10 000 фильмов + 10 000 сериалов.

при условии, что приблизительная продолжительность каждого фильма составляет 2+ часа, а телешоу - один час. Мы предоставляем видео качества SD, а также HD для контента Netflix.

В час SD-хранилище займет около 10 ГБ.

В час HD-хранилище займет около 20 ГБ.

10K videos (stored in SD & HD)
1 hour average video length
10 GB/h for SD + ~20 GB/h for HD = 30 GB/h per video
30 GB/h * 10K videos = 300,000 GB = 300 TB

Мы можем использовать решение для хранения BLOB-объектов, такое как s3 или GCS, так как в нашей постановке задачи объем данных сужен до нескольких терабайт.

Хранилище данных о действиях пользователя для решения механизма рекомендаций:

Данные о действиях пользователя состоят из временной метки воспроизводимого в данный момент видео, рейтингов пользователей и т. д.

200M users
1K videos watched per user per lifetime (~10% of total content)
100 bytes/video/user
100 bytes * 1K videos * 200M users = 100 KB * 200M = 1 GB * 20K = 20 TB

ШАГ 4. Дизайн сервисного API

  1. поисквидео(apiKey, searchQuery)
  2. getVideoSnippet(apiKey, videoId)
  3. playVideo(apiKey, videoId, userId)
  4. pauseVideo(apiKey, videoId, userId)
  5. скоростьвидео(apiKey, videoId, userId)

ШАГ 5: Высокоуровневый дизайн

ШАГ 6: Рекомендации по проектированию внешнего интерфейса высокого уровня

  • Выбор UI-фреймворка
  • Рендеринг на стороне клиента против рендеринга на стороне сервера
  • Следуя шаблону PRPL: вставьте минимальный код в начальный маршрут, рендерите маршрут и получите интерактив, предварительное кэширование с помощью сервис-воркеров, LazyLoad асинхронные (разделенные) маршруты

Сервисный работник — это скрипт, который ваш браузер запускает в фоновом режиме отдельно от веб-страницы, открывая доступ к функциям, которым не требуется веб-страница или взаимодействие с пользователем.

  • Сокращение времени загрузки страницы с помощью Minify css/js — webpack, регулярный аудит Javascript Bundle, Javascript разделение кода

ШАГ 7: Масштабируемость и другие вопросы

  • Сайт Netflix должен быть высокодоступным
  • Ожидается, что этот веб-сайт будет иметь более высокую пользовательскую нагрузку в соответствии с рекомендациями теоремы CAP. Согласованность может пострадать.

Обработка ваших данных

  • Мы можем легко хранить весь этот статический контент в реляционной базе данных.
  • Такие операции, как GetUserInfo и GetUserWatchedVideos, требующие малых задержек, специфичны для конкретных пользователей. Учитывая это, мы можем разделить нашу базу данных активности пользователей на несколько сегментов, каждый из которых управляет где-то между 1 и 10 ТБ проиндексированных данных. Это обеспечит очень быстрое чтение и запись для данного пользователя.