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

Шаг 1: Требования:

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

пользователи должны иметь возможность делиться короткими видео

продолжительность видео 1 минута

пользователи должны иметь возможность подписываться на других пользователей

пользователи должны иметь возможность просматривать ленту других пользователей

пользователи могут лайкнуть комментарий или поделиться видео

Шаг 2: Шкала высокого уровня:

1 миллион ежедневных активных пользователей

20 видео посмотреть , опубликовать 1 видео

каждое видео 10 мб

видео могут появляться с задержкой в ​​ленте подписчиков

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

задержка для видео должна быть низкой

Шаг 3: Определите компоненты системы:

- login-service будет поддерживать регистрацию/вход

- user-service будет поддерживать операции CRUD для пользователей.

- follow-user-service будет поддерживать followUSer(user1 , user 2 )

- feed-service будет поддерживать getFeed(user, page)

  • postvideo-servicepostVideo(video, text ), getPost, commentPost(идентификатор сообщения, комментарий, пользователь ), likePost(идентификатор сообщения , LikeBy пользователю), sharePost(идентификатор сообщения , sharedBy пользователем)

Шаг 4. Разработайте модель данных

  • user-service будет иметь таблицу User с базовой информацией, такой как имя пользователя, мобильный телефон/адрес электронной почты, настройки и т. д.
  • служба Follow-user будет иметь таблицу user_follows, в которой будет информация о том, что пользователь1 следует за пользователем2.
  • post-service будет иметь таблицу сообщений с такой информацией, как идентификатор сообщения, идентификатор пользователя, текст сообщения, URL-адрес видео и т. д. В этой таблице будут храниться только метаданные. Фактическое видео будет храниться в S3 или аналогичной службе хранилища объектов. Чтобы уменьшить задержку, мы будем использовать службу CDN, например CloudFront.
  • Для поддержки других функций нам понадобится еще несколько таблиц, таких как post_comments , post_shares, post_likes.
  • Из требований к хранилищу у нас будет ежедневно 1 миллион видео, каждое видео имеет размер 10 МБ. таким образом, хранилище будет увеличиваться примерно на 1 ТБ каждый день. Это нормально, чтобы быть переданным s3.
  • Учитывая, что все старые видео просматриваются не так часто, мы можем придумать приемлемую логику очистки.
  • Что касается новых видео, есть вероятность, что их будут смотреть чаще… мы даже можем рассмотреть возможность помещения их в кеш на начальный день/дни .
  • Пост-сервис представляет собой систему с интенсивным чтением и отношением чтения/записи 20:1. Поэтому нам потребуется достаточное количество реплик чтения, чтобы справиться с нагрузкой чтения.
  • Главная БД может обрабатывать операции записи, которые составляют около нескольких миллионов записей в день… что нормально для любой современной БД.
  • Как только сообщения будут записаны в master, они будут реплицированы для реплик чтения. Возможна задержка, которая подходит для наших требований.
  • служба пользовательского фида будет иметь таблицу user_feeds . Эта таблица будет предварительно заполнена информацией о каналах для каждого пользователя. Таким образом, нам не нужно будет вычислять эту информацию на лету, когда пользователь вызывает API getFeed.
  • мы поместим первые несколько каналов для пользователей в кеш, чтобы задержка была минимальной.

Шаг 5: Соедините компоненты:

Давайте посмотрим, как соединяются различные компоненты…

Шаг 6: Готовность к производству

На протяжении всего проектирования мы рассматривали возможности масштабирования каждого компонента системы. Мы можем получить более подробную информацию о каждой услуге для нужд масштабирования хранилища/вычислений.

Мы также можем подумать об обработке особых случаев, например, когда кто-то очень известный публикует что-то, и как обрабатывать эти сообщения.

Посмотрите https://www.youtube.com/watch?v=7hsRph0Ud9s для ознакомления с дизайном.