System Design

Введение в System Design

Цели урока

  • Понять что такое System Design и почему это важно
  • Изучить базовые компоненты современных систем
  • Освоить концепцию trade-offs
  • Узнать framework для решения SD задач на интервью

Предварительные знания

  • Базовое понимание HTTP и REST API
  • Опыт работы с любой базой данных
  • Понимание клиент-серверной архитектуры

Twitter, 2013 год, финал Супербоула. 143 000 твитов в секунду - рекорд, который держался годами. Instagram в том же году продался за 1 миллиард долларов с командой из 13 инженеров и 30 миллионами пользователей. WhatsApp - 450 миллионов пользователей, 55 инженеров, 19 миллиардов. System Design - не про технологии. Про trade-offs: CAP-теорема говорит, что выбрать можно только два из трёх свойств. Нет правильных ответов - есть обоснованные компромиссы.

  • **Twitter Fan-out:** при 143k RPS во время Супербоула система генерировала ленты для подписчиков через push - один твит celebrities разлетался по 10+ миллионам аккаунтов за секунды
  • **Instagram с 13 инженерами:** агрессивный кешинг в Redis, PostgreSQL для пользовательских данных, CDN для медиа - простая архитектура, доведённая до предела
  • **WhatsApp 55 инженеров / 450M пользователей:** Erlang + FreeBSD, минимум зависимостей, упор на reliability - инженерная плотность рекордная для индустрии
  • **CAP в продакшне:** DynamoDB (Amazon), Cassandra (Netflix) выбирают AP. Google Spanner добивается почти CA через атомарные часы. Каждый выбор - компромисс с последствиями

Что такое System Design?

**13 инженеров. 30 миллионов пользователей. 1 миллиард долларов.** Instagram в 2012 году продался Facebook с командой размером со стартовый состав баскетбольной команды. WhatsApp в 2014 году - 450 миллионов активных пользователей, 55 инженеров, 19 миллиардов долларов. Не рамки технологий определяют масштаб - определяют архитектурные решения.

**System Design** - это не про код и фреймворки. Это про **компоненты**, их **взаимодействие** и **компромиссы**. Вопрос «как спроектировать Twitter?» - не о языке программирования. О том, как система выдержит 143 000 твитов в секунду во время Супербоула и не упадёт.

System Design - мост между бизнес-требованиями и технической реализацией. Senior-инженер превращает «нам нужен чат» в архитектуру с конкретными компонентами, числами и обоснованными trade-offs.

**CAP-теорема одной строкой:** из трёх свойств - Consistency (согласованность), Availability (доступность), Partition tolerance (устойчивость к разделению) - реальная распределённая система выбирает два. Не три. Нет правильных ответов - есть обоснованные компромиссы. Это и есть суть System Design.

**Аналогия:** архитектор проектирует небоскрёб - не с выбора цвета обоев, а с фундамента, несущих конструкций, лифтов. System Design - то же самое, только для программных систем.

System Design охватывает широкий спектр решений:

  • **Выбор базы данных**: SQL vs NoSQL, когда что использовать
  • **Масштабирование**: как обрабатывать рост нагрузки
  • **Надёжность**: что делать, когда сервер падает
  • **Производительность**: как снизить latency
  • **Безопасность**: аутентификация, авторизация, шифрование

System Design - это выбор правильной технологии

System Design - это выбор правильного компромисса

Не существует «лучшей» базы данных или «лучшего» паттерна - есть решения, подходящие под конкретные требования. Instagram работал на PostgreSQL при 30M пользователях. Cassandra нужна при 10B событий в сутки. Технология вторична - первичны требования и trade-offs

Что НЕ является частью System Design?

Unit-тесты - это часть разработки кода, а не архитектуры системы. System Design работает на уровне компонентов и их взаимодействия, а не на уровне отдельных функций.

Зачем изучать System Design?

System Design - не академическое упражнение. Это навык, который разделяет инженеров по ценности и зарплате сильнее, чем что-либо ещё.

**1. Интервью в топовые компании**

System Design - обязательный этап в Google, Meta, Amazon, Apple, Netflix, Яндекс, Тинькофф. На Senior+ это нередко решающий раунд: провалить алгоритмы - можно восстановить, провалить System Design - offer не получишь.

**2. Карьерный рост**

Junior - пишет код по спецификации. Middle - выбирает технологии, проектирует API. Senior - видит bottleneck, предлагает архитектурные изменения. Staff - проектирует эволюцию всей платформы под 10x рост. Каждый переход требует System Design.

**3. Практическая ценность**

Понимание System Design помогает в повседневной работе:

  • Понимаешь, почему система падает под нагрузкой
  • Знаешь, как читать архитектурные диаграммы
  • Можешь участвовать в design review
  • Общаешься с командой на одном языке
  • Принимаешь обоснованные технические решения

Даже без FAANG-амбиций System Design меняет угол зрения. Перестаёшь видеть только «свой endpoint» - начинаешь видеть систему как живой организм с точками отказа, узкими местами и запасом прочности.

На каком уровне System Design становится критически важным навыком?

System Design становится критически важным при переходе на Senior уровень. Junior и Middle могут работать по готовым спецификациям, но Senior должен сам принимать архитектурные решения.

Базовые компоненты систем

Instagram, Twitter, WhatsApp - разные продукты, но под капотом одни и те же строительные блоки. Разница - в том, как их комбинировать и под какие trade-offs настраивать.

Каждый компонент решает одну проблему лучше остальных - и именно это делает архитектуру предсказуемой:

**1. Load Balancer** - точка входа, которая распределяет трафик между серверами. Решает две проблемы разом: масштабирование (один сервер не вытянет 143k RPS) и отказоустойчивость (сервер упал - трафик идёт к живым). Nginx, HAProxy, AWS ALB.

**2. Application Server** - бизнес-логика. Ключевое свойство: **stateless**. Любой сервер обрабатывает любой запрос. Это позволяет добавить 10 серверов за 5 минут - Load Balancer сам начнёт их использовать.

**3. Database** - постоянное хранилище. SQL (PostgreSQL, MySQL) - ACID-транзакции, сложные JOIN, строгая схема. NoSQL (MongoDB, Cassandra) - гибкая схема, горизонтальный шардинг, огромные объёмы записи. Выбор определяется данными, не модой.

**4. Cache** - Redis/Memcached перед базой. Горячие данные - в памяти, latency с 50 мс до 0.5 мс. Twitter держал топ-1000 пользователей в Redis постоянно - их ленты генерировались за микросекунды.

**5. CDN** - Cloudflare, AWS CloudFront. Статика и медиа из ближайшего edge-узла. Пользователь в Токио получает картинку с сервера в Токио, а не из Вирджинии.

**6. Message Queue** - Kafka, RabbitMQ, SQS. Тяжёлая задача (ресайз фото, отправка email, генерация счёта) уходит в очередь - API отвечает клиенту немедленно, воркер обрабатывает асинхронно.

Stateless - это про отсутствие сессий

Stateless - это про то, что состояние хранится отдельно от сервера

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

Почему Application Server должен быть stateless?

Stateless серверы позволяют легко масштабировать: Load Balancer может направить запрос на любой сервер, потому что состояние хранится отдельно (в БД, Cache). Это ключ к горизонтальному масштабированию.

Trade-offs: сердце System Design

**Идеальной архитектуры не существует.** Каждое решение - компромисс. Хороший инженер понимает, чем жертвует, и объясняет почему. Плохой инженер выбирает технологию потому что «все её используют».

На интервью оценивают не «правильный ответ» (его нет), а понимание trade-offs и способность принимать обоснованные решения вслух. «Здесь я выбираю X, потому что...» - это и есть ожидаемый формат.

**Trade-off #1: Consistency vs Availability**

CAP-теорема: при сетевом разделении (Partition) система выбирает одно из двух. Consistency - все ноды видят одинаковые данные в любой момент. Availability - система всегда отвечает, даже если данные могут расходиться. Банковский перевод требует Consistency. Лента Instagram выдержит eventual consistency.

**Trade-off #2: Latency vs Throughput**

Latency - время ответа на один запрос. Throughput - количество запросов в секунду. Google Search: latency p95 < 200 мс, важен каждый запрос отдельно. Обработка логов Kafka: важен суммарный поток - миллионы событий в секунду, задержка на секунды некритична. Оптимизация под одно часто жертвует другим.

**Trade-off #3: SQL vs NoSQL**

Типичная ошибка: выбрать MongoDB «потому что гибкая схема» для системы с банковскими транзакциями. Или PostgreSQL для 100 миллиардов событий в сутки. Технология следует из требований - не наоборот.

Вы проектируете систему оплаты. Что важнее?

Для финансовых систем Strong Consistency критична: нельзя допустить, чтобы два запроса видели разный баланс (double-spending). Лучше система будет недоступна, чем покажет неверные данные.

Framework решения SD задач

Интервью по System Design длится 45-60 минут. Без структуры - хаос: расплывёшься в деталях на ранней стадии, не дойдёшь до важного, потеряешь интервьюера. Вот framework, который покрывает все ожидания:

**Этап 1: Requirements - задавай вопросы**

«Спроектируй Twitter» - намеренно размытое задание. Что именно? Только постинг или ещё и поиск, рекомендации, монетизация? DAU 100K или 300M? Потоковое видео или только текст? Правильные вопросы показывают опыт - и определяют архитектуру.

**Этап 2: Estimation - back-of-envelope**

Twitter: 300M DAU × 50 твитов в сутки / 86400 = ~170k чтений/сек. Пиковая нагрузка × 3 = 500k RPS. Это уже говорит: нужен aggressive caching, read-replica базы, шардинг. Точность не нужна - нужен правильный порядок величин.

**Этап 3: High-Level Design - рисуй диаграмму**

Старт: Client → Load Balancer → App Server → Database. Затем добавляй компоненты по мере их необходимости - Cache если read-heavy, Queue если есть тяжёлые фоновые задачи, CDN если глобальная аудитория.

Думай вслух. Интервьюер оценивает процесс рассуждения, а не только результат. «Здесь добавлю Redis-кеш, потому что read:write = 100:1, и большинство запросов - чтение одних и тех же горячих профилей» - это правильный формат.

**Этап 4: Deep Dive - покажи экспертизу**

«Расскажите подробнее о X» - стандартный ход интервьюера. Будь готов нырнуть в детали любого компонента: как именно работает шардинг по user_id, какая стратегия вытеснения в кеше, как реализована репликация и что происходит при failover.

С чего нужно начинать решение System Design задачи?

Сначала Requirements! Нельзя проектировать систему, не понимая что она должна делать, какой масштаб и какие ограничения. Разные требования → разные архитектуры.

Ключевые идеи

  • **System Design** - архитектурные решения, которые определяют выдержит ли система 143k RPS или рухнет под нагрузкой первого хабаэффекта
  • **CAP-теорема** - фундамент: Consistency, Availability, Partition tolerance - реальная система выбирает два. Банк выбирает CP, соцсеть - AP
  • **6 строительных блоков**: Load Balancer, App Server (stateless!), DB, Cache, CDN, Message Queue - все системы собраны из этого набора
  • **Trade-offs, не технологии**: MongoDB vs PostgreSQL - следствие требований к данным, не мода. Latency vs Throughput - следствие типа нагрузки
  • **Framework 4 этапа**: Requirements (уточни scope) → Estimation (порядок величин) → High-Level Design (диаграмма) → Deep Dive (детали под вопрос)

Что дальше

Следующие уроки: Сбор требований (как задавать правильные вопросы), Оценка нагрузки (back-of-envelope calculations), затем разбор каждого компонента (Load Balancer, Cache, Message Queue) и паттернов (Microservices, API Gateway). Финал - реальные кейсы: проектируем Twitter, YouTube, Uber.

  • system-design — связан с

Вопросы для размышления

  • Вспомни любой продукт или сервис, которым ты пользуешься каждый день - мессенджер, стриминг, карты. Какие компромиссы (trade-offs) скрыты за его поведением? Почему он иногда показывает устаревшие данные или недоступен - это случайность или архитектурное решение?

Связанные уроки

  • sd-02-requirements — Requirements gathering is the first step of the 4-stage framework introduced here
  • alg-01-big-o — Back-of-envelope estimation mirrors complexity analysis for systems
  • st-01-feedback-loops — CAP theorem and consistency models map directly to feedback loop theory
  • prob-01-intro — Probabilistic thinking needed for SLA, error budgets, and latency percentiles
  • bt-01-overview — Transport protocols are the connective tissue between system design components
  • net-01-intro
Введение в System Design

0

1

Войти