Статьи

Ultimate System Design Checklist

Успешные прохождения System Design Интервью возможны благодаря 3ём факторам:
  1. Теоретическая проработка архитектуры.
  2. Практика решения популярных задач.
  3. Умение отвечать на конкретные вопросы по системе.
Меня зовут Невзоров Владимир. Инженер HighLoad систем. 10+ лет опыта на позициях разработчика, лида. Успешно проходил такие интервью в BigTech. Рассмотрим популярные вопросы в ультимативном чеклисте.
Возьмём для проработки важный аспект проектирования:

🔥 Core Distributed Systems & Scalability / Основы распределённых систем и масштабирование

Пришли на интервью. Выдохнули, подумали.

Пришли на интервью. Выдохнули, подумали.

1. Как решить, когда разделять монолит на сервисы?

⚙️ Базовый концепт:
Обычно монолит делят, когда команды начинают мешать друг другу, релизы замедляются или разные части системы требуют разного масштабирования.
🖌️ Схема:
🔧 Пример применения в System Design
В задаче по проектированию Ленты VK/Соц сети вы замечаете, что модуль обработки изображений (resize, компрессия, генерация превью) загружает CPU и масштабируется иначе, чем остальной backend. Это классический сигнал к выделению его в отдельный Media Processing Service, который можно масштабировать горизонтально и независимо от основного API.

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 в сервисе расчёта ETA. Когда спрос резко растёт (например, в дождь), сервис ограничивает количество одновременно обрабатываемых запросов. И возвращает клиентам заранее Вычислённые приблизительные ETA из кэша. Это позволяет сохранить стабильность критичных компонентов и избежать лавинообразного роста задержек при перегрузке.

8. Как защитить нижестоящие сервисы от всплесков трафика?

⚙️ Базовый концепт:
Используйте rate limiting, буферизацию, очереди, кэширование. Часто применяют circuit breaker.
🖌️ Схема:
🔧 Пример применения в System Design
В задаче проектирования Spotify Streaming Вы защищаете сервис рекомендаций (Recommendations Service) от всплесков трафик. При массовом заходе пользователей клиент сначала получает кэшированную подборку треков, а запросы на генерацию новых рекомендаций ограничиваются rate limiting и ставятся в очередь. Это не даёт перегрузить тяжёлый ML-сервис и обеспечивает стабильную работу проигрывания музыки.
И снова челлендж.

И снова челлендж.

9. Как проектировать API, чтобы оно развивалось без поломки клиентов?

⚙️ Базовый концепт:
Нужно использовать версионирование, расширяемые схемы и избегать ломающих изменений. Например, добавлять новые поля, не удаляя старые.
🖌️ Схема:
🔧 Пример применения в System Design
В задаче проектирования публичного API для мобильного клиента (например, Twitter API) Вы вводите версионирование /api/v1 и /api/v2. Новые поля в ответе сначала делаете необязательными и не меняете семантику старых. Это позволяет выпускать новую версию API и постепенно переводить клиентов, не ломая уже установленные приложения, которые всё ещё работают на старой схеме.

10. Как обеспечить идемпотентность write-API?

⚙️ Базовый концепт:
Используют idempotency keys, дедупликацию или логи операций. Это предотвращает двойное списание денег или дубликаты заказов.
🖌️ Схема:
🔧 Пример применения в System Design
В задаче проектирования Order Service для доставки еды Вы присваиваете каждому запросу на создание заказа уникальный request_id. Сохраняете его вместе с результатом. И возвращаете тот же ответ при повторных вызовах. Это предотвращает создание нескольких одинаковых заказов, когда клиент нажимает кнопку «Заказать» несколько раз из-за задержек или обрыва сети.
Вспомнила ответы из чеклиста!

Вспомнила ответы из чеклиста!

Итог

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