Проектирование распределённых систем
Уроки с примерами кода; тему можно сразу закрепить вопросами в тренажёре.
Материалы открываются после регистрации на Free.
Уроки по модулям
Основы проектирования систем
2 урокаС чего начинается проектирование системы: не с выбора технологий, а с требований и порядков величин. Модуль вводит рамку — функциональные и нефункциональные требования, оценка нагрузки и объёма данных «на салфетке» — и показывает, что дизайн системы это последовательность решений с ценой, а не схема из прямоугольников.
- Что такое проектирование систем
- Требования и оценка нагрузки
Ядро: масштабируемость, доступность, согласованность
8 уроковЧетыре вопроса, на которые система обязана отвечать до выбора любой технологии: выдержит ли рост нагрузки, останется ли доступной при отказе, будут ли ответы правильными и как согласовать копии данных. Модуль вводит метрики, которыми это измеряют, и предел, который накладывает распределённость.
- Масштабируемость и узкое место
- Доступность, избыточность и переключение на резерв
- Надёжность: система отвечает правильно
- Единая точка отказа и радиус поражения
- Задержка, пропускная способность и полоса
- Теорема CAP: поведение при разрыве сети
- Модели согласованности как контракт чтения
- Согласованное хеширование
Сеть под приложением
6 уроковЧто происходит между вызовом в коде и ответом сервера: слои сети и адресация, выбор между надёжным и быстрым транспортом, семантика HTTP и защищённое соединение, разрешение имени в адрес и посредники на пути запроса. Модуль даёт минимум сети, без которого нельзя объяснить задержку, таймаут и поведение балансировщика.
- Слои сети и адресация
- TCP против UDP: гарантии против задержки
- Семантика HTTP и защищённое соединение
- Разрешение имён и кэш DNS
- Прямой и обратный прокси
- Контрольные суммы и целостность данных
Балансировка нагрузки
3 урокаКак запрос находит один из многих одинаковых экземпляров сервиса: балансировщик и проверки здоровья, алгоритмы раскладки нагрузки и распределение трафика ещё до соединения — через DNS и маршрутизацию. Модуль показывает, что балансировщик решает не только «куда», но и «что делать, когда экземпляр нездоров».
- Балансировщик и проверки здоровья
- Алгоритмы раскладки нагрузки
- Распределение трафика до соединения
Контракты API
9 уроковИнтерфейс сервиса — это обещание, которое дорого менять: стиль взаимодействия, формат сообщения, поведение при повторе запроса, защита от перегрузки и общая точка входа для клиентов. Модуль разбирает, как выбирают стиль API под задачу и какие свойства контракта определяют устойчивость системы, а не удобство разработчика.
- API как контракт
- Стили взаимодействия и выбор между ними
- Проектирование ресурсного API
- Бинарные контракты и схема сообщения
- Запрос по графу данных
- Идемпотентность и безопасный повтор
- Ограничение частоты запросов
- Шлюз API как точка входа
- Identity в масштабируемой системе
Способы связи между сервисами и с клиентом
10 уроковКак части системы обмениваются событиями, не завися друг от друга во времени, и как сервер доставляет обновление клиенту, который его не запрашивал. Модуль разбирает очереди и публикацию с подпиской, гарантии доставки и судьбу необработанных сообщений, поток изменений из базы, обратные вызовы и способы держать соединение с клиентом открытым.
- Синхронный вызов против асинхронного сообщения
- Очереди сообщений
- Публикация с подпиской
- Гарантии доставки и идемпотентный потребитель
- Очередь необработанных сообщений
- Поток изменений из базы данных
- Обратные вызовы по HTTP
- Длинный опрос и поток событий от сервера
- Двусторонние соединения
- Прямое соединение между клиентами
Кэш как слой архитектуры
8 уроковКэш рассматривается не как настройка одного хранилища, а как слой в топологии: где он стоит между клиентом и источником данных, чем платит каждый слой, что происходит при массовом промахе и как кэш ведёт себя, когда он распределён по узлам и должен пережить их отказ.
- Слои кэша: где он стоит
- Выбор стратегии чтения и записи
- Политики вытеснения
- Инвалидация и свежесть данных
- Лавина запросов при промахе
- Прогрев и холодный старт
- Сеть доставки контента
- Распределённый кэш
Хранилища данных и их выбор
12 уроковХранилище выбирают не по популярности, а по модели доступа к данным: какие запросы должны быть быстрыми, что можно потерять, как данные растут. Модуль разбирает семейства хранилищ и их профили, гарантии транзакций и сохранности записи, а также две структуры на диске, из которых следует, что быстрее — чтение или запись.
- Как выбирают хранилище
- Реляционная модель и её гарантии
- Хранилища ключ-значение
- Документные хранилища
- Хранилища широких колонок
- Графовые хранилища
- Хранилища временных рядов
- Векторные хранилища
- Полнотекстовый поиск
- Транзакции и гарантии ACID
- Как база гарантирует сохранность записи
- Сбалансированное дерево против дерева слияния
Масштабирование хранилища
7 уроковЧто делают, когда одна база перестаёт справляться: снимают чтение репликами, экономят соединения, платят записью за скорость чтения, разбивают данные по узлам и по колонкам, сжимают их. Модуль показывает порядок применения этих приёмов и цену каждого шага в согласованности и сложности запросов.
- Реплики на чтение и отставание
- Пул соединений
- Денормализация и материализованные представления
- Шардирование и выбор ключа
- Горизонтальное и вертикальное разбиение
- Сжатие данных
- Индекс как компромисс
Системы хранения
4 урокаГде живут файлы, изображения, видео и резервные копии, когда их слишком много для диска одной машины. Модуль разбирает три модели доступа к хранилищу, устройство объектного хранилища, распределённые файловые системы и способ пережить отказ дисков дешевле, чем полными копиями.
- Блочное, файловое и объектное хранилище
- Объектное хранилище
- Распределённые файловые системы
- Помехоустойчивое кодирование против репликации
Ключевые компромиссы
4 урокаНесколько развилок, которые повторяются в любом проектировании: расти вверх или вширь, хранить состояние в сервисе или вынести его, кто инициирует передачу данных — источник или получатель, и чем конкурентное выполнение отличается от параллельного. Модуль собирает эти решения в явные критерии выбора.
- Рост вверх против роста вширь
- Состояние в сервисе или вне его
- Передача по инициативе источника или получателя
- Конкурентность против параллелизма
Архитектурные стили
9 уроковКрупные формы, в которые складывается система целиком: клиент и сервер, монолит и микросервисы, событийная архитектура, хранение событий вместо состояния, разделение чтения и записи, изоляция домена от инфраструктуры, вычисления без управления серверами и обмен между равными узлами. Модуль показывает, какую задачу решает каждый стиль и чем за него платят.
- Клиент-сервер и разделение на уровни
- Монолит
- Микросервисы
- Событийная архитектура
- Хранение событий вместо состояния
- Разделение моделей чтения и записи
- Гексагональная архитектура
- Бессерверные вычисления
- Обмен между равными узлами
Паттерны микросервисов
7 уроковНабор решений, которые появляются, как только сервисов становится много: общая точка входа и отдельный слой под каждый тип клиента, поиск живых экземпляров, защита от каскадного отказа и изоляция ресурсов, вынос инфраструктурной логики из кода сервиса и постепенная замена старой системы новой.
- Шлюз как единая точка входа
- Отдельный слой под клиента
- Обнаружение сервисов
- Размыкатель цепи
- Изоляция ресурсов по отсекам
- Вспомогательный контейнер и сетка сервисов
- Постепенная замена старой системы
Фундамент распределённых систем
14 уроковЧто принципиально меняется, когда вызов пересекает сеть: сообщение может пропасть, узел может быть жив, но недоступен, а часы на машинах расходятся. Модуль разбирает обнаружение отказов, упорядочивание событий без общего времени, выбор ведущего узла и согласие группы узлов на общее решение.
- Что меняет распределённость
- Разрыв сети
- Обнаружение отказов и сигналы жизни
- Работа с отказами: таймауты, повторы, деградация
- Расхождение часов
- Логические часы и порядок событий
- Векторные часы и конкурентные изменения
- Выбор ведущего узла
- Консенсус: согласие группы узлов
- Консенсус через реплицируемый журнал
- Классический протокол консенсуса
- Разделение на две активные половины
- Распределённые блокировки
- Протокол сплетен
Распределённые транзакции
5 уроковЧто делать с операцией, которая затрагивает несколько сервисов или баз, когда общей транзакции больше нет. Модуль разбирает, почему прямое обобщение транзакции на распределённую систему плохо работает, и два практичных пути: последовательность локальных транзакций с компенсациями и надёжная публикация события вместе с изменением данных.
- Почему распределённая транзакция это дорого
- Двухфазная фиксация
- Трёхфазная фиксация
- Сага и компенсирующие действия
- Шаблон исходящих сообщений
Структуры данных под масштаб
10 уроковКогда точный ответ требует памяти, которой нет, его меняют на приближённый: структуры, отвечающие «скорее всего нет» вместо «нет», оценивающие число уникальных значений и частоту без хранения элементов, сравнивающие большие наборы за один обмен и превращающие точку на карте в ключ, по которому можно искать.
- Зачем приближённые структуры
- Фильтр Блума
- Кукушкин фильтр
- Счётный эскиз частоты
- Оценка числа уникальных значений
- Оценка схожести наборов
- Дерево хешей
- Список с пропусками
- Пространственные индексы
- Кодирование координат и разбиение сферы
Обработка больших данных
7 уроковКак считают то, что не помещается в один запрос к базе: обработка накопленным объёмом или непрерывным потоком, распределённое вычисление по узлам, перенос данных в аналитическое хранилище и архитектуры, которые пытаются совместить точность батча со свежестью потока.
- Пакетная обработка против потоковой
- Распределённое вычисление по узлам
- Потоковые движки: окна и состояние
- Конвейеры переноса и преобразования
- Аналитическое хранилище
- Озеро данных и гибридный подход
- Совмещение точности и свежести
Выкладка без простоя
7 уроковВыкладка новой версии — штатная операция, которая чаще всего и роняет систему. Модуль разбирает стратегии постепенной замены и параллельной среды, выкатку на долю трафика, отделение выкладки кода от включения функции, возврат к прошлой версии и конвейер, который делает всё это повторяемым.
- Стратегии выкладки и критерий выбора
- Постепенная замена экземпляров
- Параллельная среда и переключение
- Выкатка на долю трафика
- Флаги функций
- Откат и неизменяемая инфраструктура
- Конвейер сборки и доставки
Наблюдаемость
7 уроковРаспределённую систему нельзя отладить, зайдя на сервер: запрос проходит через десяток сервисов, и понять, где он замедлился, можно только по тому, что система о себе сообщает. Модуль разбирает метрики, логи и трассировку, сквозной идентификатор запроса, оповещения по симптому и то, что видит дежурный в момент инцидента.
- Три вида телеметрии
- Метрики и разметка кода
- Логи: структура, уровни, сбор
- Распределённая трассировка
- Сквозной идентификатор запроса
- Оповещения по симптому
- Панели и инструкции дежурного
Безопасность на уровне системы
6 уроковБезопасность здесь рассматривается как свойство топологии, а не как настройка одного приложения: где заканчивается защищённый канал и что происходит с трафиком дальше, как шифруются данные на хранении, откуда сервисы берут секреты, как раздают права и что меняется, когда вход в систему принадлежит организации-клиенту.
- Защищённое соединение в топологии
- Шифрование данных на хранении
- Управление секретами
- Доступ на основе ролей
- Корпоративный единый вход
- Хранение паролей
О курсе
Как устроены системы, которые держат нагрузку, переживают отказы узлов и разрывы сети: метрики и пределы (масштабируемость, доступность, надёжность, теорема CAP), сеть и балансировка, контракты API и способы связи сервисов, слои кэша, выбор хранилища и стратегии его распределения, архитектурные стили и паттерны микросервисов, фундамент распределённых систем от часов и консенсуса до распределённых транзакций, структуры данных под масштаб, обработка больших данных, выкладка, наблюдаемость и безопасность. Цель — модель решений и их цены: что ломается при росте нагрузки, что при отказе узла, что при разрыве сети, и чем вы платите за каждый выбор. Курс языко-нейтрален.