Учебник System Design для начинающих
Концептуальный курс по проектированию распределённых систем для разработчиков, которые готовятся к собеседованиям по system design и растут в сторону архитектуры. Мы разбираем не «как написать код», а как мыслить о системах: собирать требования, оценивать масштаб «на салфетке», выбирать между подходами и осознанно идти на компромиссы (trade-offs).
Внутри — масштабирование и балансировка, хранение данных и теорема CAP, кэширование и CDN, очереди и асинхронность, надёжность, а в финале — пошаговый разбор классических задач собеседования: сократитель ссылок, новостная лента и мессенджер. Упор на таблицы сравнения, числовые прикидки и объяснение, почему выбирают то или иное решение.
Курс «System Design» состоит из 6 разделов и 24 уроков: Основы и подход к задаче, Масштабирование и балансировка, Хранение данных, Кэширование и доставка, Асинхронность и связь сервисов и Надёжность и разбор кейсов. Уроки идут по порядку — от основ к более сложным темам, в каждом есть объяснение с примерами, а в конце — вопросы для самопроверки. К урокам привязаны задачи с автоматической проверкой: прочитали тему — сразу закрепили её кодом.
Программа курса
1 Основы и подход к задаче
- Что такое system design и как мыслить
Что такое проектирование систем, чем оно отличается от написания кода, и почему на собеседовании ценят ход мысли и компромиссы, а не «правильный» ответ.
- Сбор требований: функциональные и нефункциональные
Как собирать требования к системе: функциональные (что делает) и нефункциональные (скорость, доступность, масштаб). Какие вопросы задать, чтобы сузить задачу.
- Оценки «на салфетке»: QPS, объём данных, хранилище
Как быстро прикинуть нагрузку системы: QPS из числа пользователей, объём данных и хранилища, пропускную способность. Степени двойки и удобные округления.
- Метрики: latency, throughput и «девятки» доступности
Ключевые метрики систем: latency и перцентили (p50/p99), throughput, доступность в «девятках» (99,9% / 99,99%) и сколько это минут простоя. Что важнее для чего.
- Что такое system design и как мыслить
2 Масштабирование и балансировка
- Вертикальное и горизонтальное масштабирование
Два способа выдержать рост нагрузки: вертикальное (мощнее сервер) и горизонтальное (больше серверов). Их компромиссы, пределы и почему индустрия выбирает scale-out.
- Балансировщики нагрузки: алгоритмы и L4/L7
Зачем нужен балансировщик нагрузки, какие бывают алгоритмы распределения (round-robin, least connections, hash) и в чём разница между L4 и L7. Health-чеки и sticky sessions.
- Stateless-сервисы и почему это важно
Что такое stateless-сервис, почему отсутствие локального состояния — ключ к горизонтальному масштабированию и отказоустойчивости, и куда выносить сессии и состояние.
- Шардирование, партиционирование и согласованное хеширование
Как разделить данные между узлами: партиционирование и шардирование, выбор ключа, проблема «горячих» шардов и согласованное хеширование (consistent hashing) наглядно.
- Вертикальное и горизонтальное масштабирование
3 Хранение данных
- SQL или NoSQL: когда что выбирать
Чем реляционные базы отличаются от NoSQL, когда нужны транзакции и схема, а когда — гибкость и масштаб. Типы NoSQL и честная таблица компромиссов для собеседования.
- Репликация: master-slave, multi-master и отставание реплик
Зачем копировать данные на несколько узлов: master-slave и multi-master, синхронная и асинхронная репликация, проблема отставания реплик (replication lag) и как с ней жить.
- Индексы и денормализация
Как индексы ускоряют чтение и замедляют запись, что такое нормализация и денормализация, и почему ради скорости иногда осознанно дублируют данные.
- Теорема CAP и модели согласованности
Теорема CAP наглядно: при сетевом сбое выбираешь между согласованностью и доступностью. Strong и eventual consistency, и почему «выбрать CA» — миф.
- SQL или NoSQL: когда что выбирать
4 Кэширование и доставка
- Зачем кэш и где он живёт
Что такое кэш, почему он ускоряет систему и снимает нагрузку с базы, и какие уровни кэширования существуют: клиент, CDN, сервер, база данных.
- Стратегии кэширования и инвалидация
Стратегии записи в кэш: cache-aside, write-through, write-back. Инвалидация и TTL, проблема устаревания данных и одна из двух сложнейших задач в IT.
- CDN, статика и алгоритмы вытеснения
Что такое CDN и как он ускоряет доставку статики по миру. Почему кэш ограничен по памяти и как выбирают, что выкинуть: LRU, LFU, FIFO и другие политики вытеснения.
- Зачем кэш и где он живёт
5 Асинхронность и связь сервисов
- Синхронное и асинхронное взаимодействие
Разница между синхронным и асинхронным взаимодействием сервисов: когда ждать ответа, а когда отправить и забыть. Их компромиссы по задержке, связности и надёжности.
- Очереди сообщений и брокеры: Kafka и RabbitMQ
Зачем нужны очереди сообщений и брокеры, как они сглаживают нагрузку и развязывают сервисы. Обзор Kafka и RabbitMQ и в чём их принципиальная разница.
- Publish/Subscribe и гарантии доставки
Паттерн publish/subscribe для рассылки событий многим подписчикам. Гарантии доставки: at-most-once, at-least-once, exactly-once и зачем нужна идемпотентность.
- Rate limiting и backpressure
Как защитить систему от перегрузки: ограничение частоты запросов (rate limiting) алгоритмами token bucket и др., и backpressure — сигнал «помедленнее» вверх по потоку.
- Синхронное и асинхронное взаимодействие
6 Надёжность и разбор кейсов
- Отказоустойчивость: резервирование, деградация, circuit breaker
Как строить системы, которые переживают отказы: резервирование и отсутствие единой точки отказа, graceful degradation, паттерн circuit breaker и таймауты с ретраями.
- Мониторинг, логирование и микросервисы против монолита
Как видеть, что происходит в системе: метрики, логи, трейсинг и алерты. Компромиссы между монолитом и микросервисами — когда что выбирать на собеседовании.
- Кейс: сократитель ссылок (URL shortener)
Пошаговый разбор проектирования сократителя ссылок по шаблону собеседования: требования, оценки масштаба, схема, генерация коротких кодов, хранилище, узкие места.
- Кейс: новостная лента (news feed)
Проектируем ленту соцсети по шаблону: требования, оценки, схема. Главный компромисс fan-out on write против fan-out on read и проблема знаменитостей.
- Кейс: чат и мессенджер
Проектируем мессенджер по шаблону: требования, оценки, схема. Push против polling, WebSocket и соединения, доставка офлайн-сообщений и индикатор «онлайн».
- Отказоустойчивость: резервирование, деградация, circuit breaker