Основы System Design

Базовый System Design
≈ 2 мин чтения

Сначала понять задачу, потом рисовать архитектуру

System Design начинается не с выбора базы данных, очереди или кэша. Сначала нужно понять, что система должна делать, какие свойства для неё важны и какие ограничения повлияют на решения. Только после этого отдельные компоненты начинают складываться в осмысленную архитектуру.

В этом разделе мы соберём базовый набор понятий, который понадобится почти в любой задаче на проектирование системы. Здесь не будет готовой «идеальной архитектуры» — вместо неё появится последовательный способ рассуждать о системе.

Что разберём

  • Процесс проектирования. Научимся двигаться от постановки задачи к общей схеме системы и проверять решение на слабые места.
  • Функциональные требования. Разберём, как зафиксировать действия и сценарии, которые система обязана поддерживать.
  • Нефункциональные требования. Посмотрим на скорость, масштабирование, доступность и другие свойства, которые определяют качество системы.
  • Latency и Throughput. Разделим два разных вопроса: насколько быстро выполняется отдельный запрос и сколько работы система способна обработать за единицу времени.
  • Доступность и надёжность. Поймём, чем «сервис сейчас отвечает» отличается от «система работает правильно и предсказуемо».
  • Stateless и Stateful. Разберём, где живёт состояние системы и почему это напрямую влияет на масштабирование и отказоустойчивость.
  • Архитектурные компромиссы. Научимся смотреть на решение не как на набор плюсов, а как на обмен одних свойств системы на другие.

Эти темы связаны в одну цепочку: требования задают цель, метрики помогают сделать её измеримой, состояние определяет устройство компонентов, а компромиссы объясняют, почему разные системы приходят к разной архитектуре. Следующим шагом после этого фундамента уже можно переходить к оценке реальной нагрузки.

Главная привычка System Design: не спрашивать «какую технологию поставить?», пока не понятно, какую конкретно проблему она должна решить.