Если нет, пожалуйста, прочтите Как шаг за шагом подходить к вопросам собеседования по проектированию системы».
Шаг 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 для ознакомления с дизайном.