
Успешные прохождения System Design Интервью возможны благодаря 3ём факторам:
Теоретической проработки архитектуры.
Практики решения популярных задач.
Умения отвечать на конкретные вопросы по системе.
Меня зовут Невзоров Владимир. Инженер HighLoad систем. 10+ лет опыта на позициях разработчика, лида. Успешно проходил такие интервью в BigTech. Благодаря ультимативному чеклисту рассмотрим 3ий пункт подробнее.
Возьмём для проработки на сегодня следующий важный аспект проектирования:
? Core Distributed Systems & Scalability / Основы распределённых систем и масштабирование

1. Как решить, когда разделять монолит на сервисы?
⚙️ Базовый концепт:
Монолит делят когда команды начинают мешать друг другу, релизы замедляются или разные части системы требуют разного масштабирования. Особенно когда в нас - интервьюируемых - бросаются цифрами в млн, млрд DAU.
?️ Схема:

? Пример применения в System Design
В задаче по проектированию Ленты VK/Соц сети вы замечаете, что модуль обработки изображений (resize, компрессия, генерация превью) загружает CPU и масштабируется иначе, чем остальной бэкэнд. Это классический сигнал к выделению его в отдельный сервис. Назовём его Media Processing Service. Который можно масштабировать горизонтально и независимо других. И распределять нагрузку между его инстансами благодаря балансировщику.
2. Как проходит запрос сквозь систему?
⚙️ Базовый концепт:
Важно понимать путь:
Клиент → API → сервисы → БД
И обратно. Это помогает находить узкие места и точки отказа. Плюс, показывает интервьюеру, что вы понимаете все взаимодействия внутри системы.
?️ Схема:

? Пример применения в System Design
В задаче проектирования X-Taxi вы описываете путь запроса «найти машину»:
Клиент → API Gateway → геолокационный сервис → сервис подбора водителей → кэш ближайших водителей → выбор ближайшего → подтверждение им поездки → окончательное формирование заказа → нотификация клиента.
Такой разбор помогает показать взаимодействие сервисов. Поревьюить для себя насколько система хорошо обрабатывает пользовательские сценарии.

3. Как спроектировать сервис, который выдержит нагрузку в 10 раз больше с минимальными изменениями?
⚙️ Базовый концепт:
Обычно включают горизонтальное масштабирование, кэширование и асинхронную обработку. Например, вынос тяжёлых задач в очередь.
?️ Схема:

? Пример применения в System Design
В задаче проектирования News Feed внезапно увеличивается RPS на получение ленты. Интервьюер включил рубильник. Вместо серьёзной переработки архитектуры вводите кэширование собранной ленты в Redis. Тем самым разгружая базу при росте нагрузки.
4. Каковы реальные компромиссы между вертикальным и горизонтальным масштабированием?
⚙️ Базовый концепт:
Вертикальное проще, но ограничено ресурсами машины. Горизонтальное сложнее, но масштабируется почти бесконечно(условно, конечно).
?️ Схема:

? Пример применения в System Design
В задаче проектирования Booking-подобной системы растёт объём запросов к базе доступных отелей. Сначала вы масштабируете СУБД вертикально. Добавляете CPU, RAM и более быстрые диски. Это даёт мгновенный, но ограниченный прирост.
Когда этот путь исчерпывается, переходите на горизонтальное масштабирование. Вводите реплики для чтения и шардинг по регионам. Получаете усложнение архитектуры ради способности выдерживать дальнейший рост нагрузки.

5. Как выбрать между синхронным и асинхронным взаимодействием?
⚙️ Базовый концепт:
Синхронное проще, но увеличивает задержки и связность. Асинхронное лучше выдерживает пики. Но сложнее в отладке.
?️ Схема:

? Пример применения в System Design
В задаче проектирования YouTube вы решаете, что загрузка файла завершается синхронно. Пользователь сразу получает подтверждение, что видео сохранено.
А рендеринг, генерация превью, обработка нескольких видов разрешений и распределение по CDN выполняются асинхронно через очередь задач. Потому что это тяжелые процессы и не должны блокировать ответ пользователю.
6. Когда использовать Remote Procedure Call(RPC) вместо очереди?
⚙️ Базовый концепт:
RPC подходит для быстрых, жёстко связанных операций.
?️ Схема:

? Пример применения в System Design
Когда вы добавляете Payment Service, выбирайте RPC вместо очереди.
Здесь очередь была бы лишней: она добавила бы задержку и усложнила бы обработку ошибок. Тогда как синхронный RPC-вызов даёт детерминированный результат прямо в рамках одного запроса.

7. Как спроектировать систему, устойчивую к перегрузкам (backpressure)?
⚙️ Базовый концепт:
Ограничивайте входящие запросы, замедляйте продюсеров и используйте очереди.
?️ Схема:

? Пример применения в System Design
В задаче проектирования Ride Matching для X-Taxi вы вводите backpressure в сервисе расчёта времени прибытия - estimated time of arrival(ETA). Когда спрос резко растёт (например, в дождь), сервис ограничивает количество одновременно обрабатываемых запросов. И возвращает клиентам заранее вычислённые приблизительные ETA из кэша. Это позволяет сохранить стабильность критичных компонентов и избежать лавинообразного роста задержек при перегрузке.
8. Как защитить нижестоящие сервисы от всплесков трафика?
⚙️ Базовый концепт:
Используйте rate limiting, буферизацию, очереди, кэширование. Часто применяют circuit breaker.
?️ Схема:

? Пример применения в System Design
В задаче проектирования сервиса стриминга аудио вы защищаете сервис рекомендаций (Recommendations Service) от всплесков трафика. При массовом заходе пользователей клиент сначала получает кэшированную подборку треков, а запросы на генерацию новых рекомендаций ограничиваются rate limiting и ставятся в очередь. Это не даёт перегрузить тяжёлый ML-сервис и обеспечивает стабильную работу проигрывания музыки.

9. Как проектировать и развивать API?
⚙️ Базовый концепт:
Нужно использовать версионирование, расширяемые схемы и избегать ломающих изменений. Например, добавлять новые поля, не удаляя старые.
?️ Схема:

? Пример применения в System Design
В задаче проектирования сервиса заказа еды(Order Service) вы вводите версионирование по типу - /api/v1. Это позволяет выпускать новую версию API и постепенно переводить клиентов, не ломая уже установленные приложения, которые всё ещё работают на старой схеме.
10. Как обеспечить идемпотентность write-API?
⚙️ Базовый концепт:
Используют ключи идемпотентности(idempotency keys) и дедупликацию. Это предотвращает двойное списание денег или дубликаты заказов.
?️ Схема:

? Пример применения в System Design
В задаче проектирования сервиса заказа еды/маркетплейса присваиваете каждому запросу на создание заказа уникальный request_id. Сохраняете его вместе с результатом. И возвращаете тот же ответ при повторных вызовах. Это предотвращает создание нескольких одинаковых заказов, когда клиент нажимает кнопку «Заказать» несколько раз из-за задержек или обрыва сети.

Итог
Теперь Вы можете ответить на 10 популярных вопросов System Design Интервью. Что заметно усилит Ваше прохождение! ?
? Если хотите разборы задач уровня FAANG, подписывайтесь на мой канал @system_design_world. А ещё освещаю System Design Паттерны, провожу публичное интервью, устраиваем сообществом архитектурные каты⭐
(вдохновлён статьей Puneet Patwari)