Успешные прохождения System Design Интервью возможны благодаря 3ём факторам:

  1. Теоретической проработки архитектуры.

  2. Практики решения популярных задач.

  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-вызов даёт детерминированный результат прямо в рамках одного запроса.

Включаем мозг на 100%. Ищем подходящее под требования решения.
Включаем мозг на 100%. Ищем подходящее под требования решения.

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)

Комментарии (0)