Как задизайнить Facebook за пол часа или секреты System Design Interview / Алексей Петров
Тема очень обширная, поэтому этот раздел следует воспринимать как чеклист для его прохождения.
Будем считать что тайм-слот интервью - 40 минут.
Собираем ответы на вопросы “Что система делает?” и “Какой должна быть система?”
Примеры вопросов:
Если нам предлагают спроектировать систему по примеру существующей (twitter, facebook, google docs, etc), то мы можем спросить: - Какую часть системы мы проектируем? - Какие именно функции должны быть реализованы?
Сразу формируем для себя чек-лист требований, чтобы не забыть что-то важное. Например нам предложили спроектировать Facebook с такими требованиями:
Чтобы посчитать эстимейты нужно примерно представить какой тип информации сколько весит.
Хранение информации: - Символ - 1 байт - Метаданные (строка в базе, вес поста, etc) - 5-10 килобайт - 1080p изображение - 2 мегабайта - 1080p видео (минута) - 30 мегабайт
Сервера: - Дисковое пространство - 10 терабайт - RAM - 256-512 гигабайт
Итого считаем эстимейты для примера с фейсбуком: - Read-write ratio - 5B / 10M = 500:1 - RPS - Read: 5B / (24 * 60 * 60) = ~58k rps - Write: 10M / (24 * 60 * 60) = ~115 rps - Storage: - 10KB * 10M = 100GB ежедневно - 30 * 100GB = 3TB ежемесячно - Пропускная способность: - Read: 5B * 20 постов * 10KB = 1PB ежедневно - Write: 10M * 10KB = 100GB ежедневно
PS. RPS мы посчитали “постоянный”, в пиках он может увеличиваться в 10 раз (условно)
Описываем максимально просто - какие методы будут доступны, какие параметры будут принимать.
Не стоит называть какие-то конкретные технологии, а просто описывать какие компоненты будут в системе и как они будут взаимодействовать. Ну тоесть не нужно прям называть Nginx, а просто описать что будет балансировщик нагрузки.
В процессе, если мы сталкиваемся с проблемой производительности, то мы можем применять следующие мантры: - Не делай этого - Делай, но только один раз - Делай это реже - Сделай это позже - Сделай пока пользователь этого не видит - Сделай это параллельно - Сделай это дешевле
Если говорим про шардирование, то сразу оговариаем какой ключ шардирования выбираем.
В зависимости от количества пользователей нам может понадобиться разные инфраструктурные решения: