Computer Science

Учебник System Design для начинающих

24 урока · 6 разделов · бесплатно, без регистрации

Концептуальный курс по проектированию распределённых систем для разработчиков, которые готовятся к собеседованиям по system design и растут в сторону архитектуры. Мы разбираем не «как написать код», а как мыслить о системах: собирать требования, оценивать масштаб «на салфетке», выбирать между подходами и осознанно идти на компромиссы (trade-offs).

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

Курс «System Design» состоит из 6 разделов и 24 уроков: Основы и подход к задаче, Масштабирование и балансировка, Хранение данных, Кэширование и доставка, Асинхронность и связь сервисов и Надёжность и разбор кейсов. Уроки идут по порядку — от основ к более сложным темам, в каждом есть объяснение с примерами, а в конце — вопросы для самопроверки. К урокам привязаны задачи с автоматической проверкой: прочитали тему — сразу закрепили её кодом.

Программа курса

  1. 1 Основы и подход к задаче

    1. Что такое system design и как мыслить

      Что такое проектирование систем, чем оно отличается от написания кода, и почему на собеседовании ценят ход мысли и компромиссы, а не «правильный» ответ.

    2. Сбор требований: функциональные и нефункциональные

      Как собирать требования к системе: функциональные (что делает) и нефункциональные (скорость, доступность, масштаб). Какие вопросы задать, чтобы сузить задачу.

    3. Оценки «на салфетке»: QPS, объём данных, хранилище

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

    4. Метрики: latency, throughput и «девятки» доступности

      Ключевые метрики систем: latency и перцентили (p50/p99), throughput, доступность в «девятках» (99,9% / 99,99%) и сколько это минут простоя. Что важнее для чего.

  2. 2 Масштабирование и балансировка

    1. Вертикальное и горизонтальное масштабирование

      Два способа выдержать рост нагрузки: вертикальное (мощнее сервер) и горизонтальное (больше серверов). Их компромиссы, пределы и почему индустрия выбирает scale-out.

    2. Балансировщики нагрузки: алгоритмы и L4/L7

      Зачем нужен балансировщик нагрузки, какие бывают алгоритмы распределения (round-robin, least connections, hash) и в чём разница между L4 и L7. Health-чеки и sticky sessions.

    3. Stateless-сервисы и почему это важно

      Что такое stateless-сервис, почему отсутствие локального состояния — ключ к горизонтальному масштабированию и отказоустойчивости, и куда выносить сессии и состояние.

    4. Шардирование, партиционирование и согласованное хеширование

      Как разделить данные между узлами: партиционирование и шардирование, выбор ключа, проблема «горячих» шардов и согласованное хеширование (consistent hashing) наглядно.

  3. 3 Хранение данных

    1. SQL или NoSQL: когда что выбирать

      Чем реляционные базы отличаются от NoSQL, когда нужны транзакции и схема, а когда — гибкость и масштаб. Типы NoSQL и честная таблица компромиссов для собеседования.

    2. Репликация: master-slave, multi-master и отставание реплик

      Зачем копировать данные на несколько узлов: master-slave и multi-master, синхронная и асинхронная репликация, проблема отставания реплик (replication lag) и как с ней жить.

    3. Индексы и денормализация

      Как индексы ускоряют чтение и замедляют запись, что такое нормализация и денормализация, и почему ради скорости иногда осознанно дублируют данные.

    4. Теорема CAP и модели согласованности

      Теорема CAP наглядно: при сетевом сбое выбираешь между согласованностью и доступностью. Strong и eventual consistency, и почему «выбрать CA» — миф.

  4. 4 Кэширование и доставка

    1. Зачем кэш и где он живёт

      Что такое кэш, почему он ускоряет систему и снимает нагрузку с базы, и какие уровни кэширования существуют: клиент, CDN, сервер, база данных.

    2. Стратегии кэширования и инвалидация

      Стратегии записи в кэш: cache-aside, write-through, write-back. Инвалидация и TTL, проблема устаревания данных и одна из двух сложнейших задач в IT.

    3. CDN, статика и алгоритмы вытеснения

      Что такое CDN и как он ускоряет доставку статики по миру. Почему кэш ограничен по памяти и как выбирают, что выкинуть: LRU, LFU, FIFO и другие политики вытеснения.

  5. 5 Асинхронность и связь сервисов

    1. Синхронное и асинхронное взаимодействие

      Разница между синхронным и асинхронным взаимодействием сервисов: когда ждать ответа, а когда отправить и забыть. Их компромиссы по задержке, связности и надёжности.

    2. Очереди сообщений и брокеры: Kafka и RabbitMQ

      Зачем нужны очереди сообщений и брокеры, как они сглаживают нагрузку и развязывают сервисы. Обзор Kafka и RabbitMQ и в чём их принципиальная разница.

    3. Publish/Subscribe и гарантии доставки

      Паттерн publish/subscribe для рассылки событий многим подписчикам. Гарантии доставки: at-most-once, at-least-once, exactly-once и зачем нужна идемпотентность.

    4. Rate limiting и backpressure

      Как защитить систему от перегрузки: ограничение частоты запросов (rate limiting) алгоритмами token bucket и др., и backpressure — сигнал «помедленнее» вверх по потоку.

  6. 6 Надёжность и разбор кейсов

    1. Отказоустойчивость: резервирование, деградация, circuit breaker

      Как строить системы, которые переживают отказы: резервирование и отсутствие единой точки отказа, graceful degradation, паттерн circuit breaker и таймауты с ретраями.

    2. Мониторинг, логирование и микросервисы против монолита

      Как видеть, что происходит в системе: метрики, логи, трейсинг и алерты. Компромиссы между монолитом и микросервисами — когда что выбирать на собеседовании.

    3. Кейс: сократитель ссылок (URL shortener)

      Пошаговый разбор проектирования сократителя ссылок по шаблону собеседования: требования, оценки масштаба, схема, генерация коротких кодов, хранилище, узкие места.

    4. Кейс: новостная лента (news feed)

      Проектируем ленту соцсети по шаблону: требования, оценки, схема. Главный компромисс fan-out on write против fan-out on read и проблема знаменитостей.

    5. Кейс: чат и мессенджер

      Проектируем мессенджер по шаблону: требования, оценки, схема. Push против polling, WebSocket и соединения, доставка офлайн-сообщений и индикатор «онлайн».