[System Design Thinking] Mikhail Smarshchok - System Design for Interviews and Beyond (2023)
Учебная программа курса1. Введение
1.1. Введение в курс
1.2. Кому и как курс будет полезен
1.3. Обзор курса
2. Как определить системные требования
2.1. Системные требования
2.2. Функциональные требования
2.3. Высокая доступность
2.4. Отказоустойчивость, устойчивость к сбоям, надежность
2.5. Масштабируемость
2.6. Производительность
2.7. Надежность
2.8. Согласованность
2.9. Обслуживаемость, безопасность, стоимость
2.10. Сводка системных требований
3. Как достичь определенных качеств системы с помощью аппаратных средств
3.1. Регионы, зоны доступности, центры обработки данных, стойки, серверы
3.2. Физические серверы, виртуальные машины, контейнеры, безсерверные
3.3. Основы надежной, масштабируемой и быстрой коммуникации
3.4. Синхронная vs асинхронная коммуникация
3.5. Асинхронные шаблоны обмена сообщениями
3.6. Сетевые протоколы
3.7. Блокирующий vs неблокирующий ввод-вывод
3.8. Форматы кодирования данных
3.9. Подтверждение сообщений
4. Как улучшить производительность системы с помощью кэша
4.1. Кэш дедупликации
4.2. Кэш метаданных
5. Важность очередей в распределенных системах
5.1. Очередь
5.2. Проблемы полной и пустой очереди
5.3. Начните с чего-то простого
5.4. Блокирующая очередь и шаблон производитель-потребитель
5.5. Пул потоков
5.6. Архитектура больших вычислений
6. Внутренности систем хранения данных
6.1. Журнал
6.2. Индекс
6.3. Данные временных рядов
6.4. Простая база данных ключ-значение
6.5. Индекс B-дерева
6.6. Встроенная база данных
6.7. RocksDB
6.8. LSM-дерево vs B-дерево
6.9. Кэш страниц
7. Как построить эффективную коммуникацию в распределенных системах
7.1. Push vs pull
7.2. Обнаружение хостов
7.3. Обнаружение служб
7.4. Обнаружение пиров
7.5. Как выбрать сетевой протокол
7.6. Сетевые протоколы в реальных системах
7.7. Видео через HTTP
7.8. CDN
7.9. Технологии push и pull
7.10. Технологии push и pull в реальных системах
7.11. Архитектуры масштабирования push на больших масштабах
8. Как доставлять данные надежно
8.1. Что еще нужно знать для создания надежных, масштабируемых и быстрых систем
8.2. Тайм-ауты
8.3. Что делать с неудачными запросами
8.4. Когда повторять попытку
8.5. Как повторять попытку
8.6. Гарантии доставки сообщений
8.7. Смещения потребителей
9. Как быстро доставлять данные
9.1. Пакетирование
9.2. Сжатие
10. Как доставлять данные на большом масштабе
10.1. Как масштабировать потребление сообщений
10.2. Разбиение на разделы в реальных системах
10.3. Стратегии разбиения на разделы
10.4. Маршрутизация запросов
10.5. Перебалансировка разделов
10.6. Консистентное хеширование
11. Как защитить серверы от клиентов
11.1. Перегрузка системы
11.2. Автомасштабирование
11.3. Проектирование системы автоматического масштабирования
11.4. Отбрасывание нагрузки
11.5. Ограничение скорости
11.6. Как защитить клиентов от серверов
11.7. Синхронные и асинхронные клиенты
11.8. Выключатель цепи
11.9. Принцип проектирования fail-fast
11.10. Балка
11.11. Shuffle sharding
12. Эпилог
12.1. Конец (но не совсем)
Темы:
Системные требования (функциональные и нефункциональные требования)
Функциональные требования (как определить, работая в обратном направлении)
Высокая доступность (доступность на основе времени и количества участников, принципы проектирования, лежащие в основе высокой доступности, процессы, лежащие в основе высокой доступности, SLO, SLA)
Отказоустойчивость, устойчивость, надежность (ошибка, failure, провал, отказоустойчивость, устойчивость, game day vs chaos engineering, ожидаемые и неожиданные сбои, надежность)
Масштабируемость (вертикальное и горизонтальное масштабирование, эластичность в сравнении с масштабируемостью)
Производительность (задержка, пропускная способность, процентили, способы увеличения записи и пропускной способности, полоса пропускания)
Долговечность (резервное копирование (полное, дифференциальное, инкрементное), RAID, репликация, контрольная сумма, доступность в сравнении с долговечностью)
Согласованность (модели согласованности, конечная согласованность, линеаризуемость, монотонные чтения, операции чтения после записи, последовательные чтения с префиксом)
Ремонтопригодность, безопасность, стоимость (аспекты ремонтопригодности (режимы сбоев и способы их устранения, мониторинг, тестирование, развертывание), аспекты безопасности (триада CIA, управление идентификацией и разрешениями, защита инфраструктуры, защита данных), аспекты затрат (проектирование, обслуживание, аппаратное обеспечение, программное обеспечение))
Краткое изложение системных требований (единый список наиболее популярных нефункциональных требований)
Регионы, зоны доступности, центры обработки данных, стойки, серверы (как аппаратное обеспечение помогает достичь определенных качеств)
Физические серверы, виртуальные машины, контейнеры, бессерверные (плюсы и минусы различных вычислительных сред, для чего они хороши)
Синхронная и асинхронная коммуникация (синхронные модели запроса-ответа и асинхронные модели обмена сообщениями)
Асинхронные шаблоны обмена сообщениями (постановка сообщений в очередь, публикация / подписка, конкурирующие потребители, обмен сообщениями с запросами / ответами, приоритетная очередь, проверка заявок)
Сетевые протоколы (TCP, UDP, HTTP, HTTP-запрос и ответ)
Блокирующий против неблокирующего ввода-вывода (сокет (блокирующий и неблокирующий), соединение, поток на модель соединения, поток на запрос с неблокирующей моделью ввода-вывода, модель цикла событий, параллелизм против параллелизма)
Форматы кодирования данных (текстовые и двоичные форматы, варианты совместного использования схемы, обратная совместимость, прямая совместимость)
Подтверждение сообщения (безопасный и небезопасный режимы подтверждения)
Кэш дедупликации (локальный или внешний кэш, добавление данных в кэш (явно, неявно), удаление данных из кэша (в зависимости от размера, времени, явно), истечение срока действия или обновление)
Кэш метаданных (шаблон кэширования в стороне, шаблоны чтения и сквозной записи, шаблон обратной записи)
Очередь (ограниченные и неограниченные очереди, кольцевой буфер и его приложения)
Проблемы с заполнением и опустошением очереди (сброс нагрузки, ограничение скорости, что делать с неудачными запросами, противодавление, эластичное масштабирование)
Начните с чего-нибудь простого (сходства между концепциями единой машины и распределенной системы, совет по проведению собеседования)
Блокирующая очередь и шаблон производитель-потребитель (шаблон производитель-потребитель, ожидание и уведомление, семафоры, приложения с блокировкой очереди)
Пул потоков (плюсы и минусы, задачи, связанные с процессором и вводом-выводом, плавное завершение работы)
Архитектура больших вычислений (модель пакетных вычислений, смущающие параллельные задачи)
Журнал (соотношение памяти и диска, сегментация журнала, положение сообщения (смещение))
Индекс (как внедрить эффективный индекс для системы обмена сообщениями)
Данные временных рядов (как хранить и извлекать данные временных рядов в масштабе и с низкой задержкой)
Простая база данных ключ-значение (как создать простую базу данных ключ-значение, сжатие журнала)
Индекс B-дерева (как базы данных и системы обмена сообщениями используют индексы B-дерева)
Встроенная база данных (встроенная или удаленная база данных)
RocksDB (memtable, журнал предварительной записи, таблица отсортированных строк (SSTable))
LSM-tree vs B-tree (логарифмически структурированная структура данных слияния-дерева, усиление записи, усиление чтения)
Кэш страниц (как увеличить пропускную способность диска (пакетирование, чтение с нулевой копией))
Push vs pull (плюсы и минусы обеих моделей)
Поиск хоста (DNS, anycast)
Обнаружение служб (шаблоны обнаружения на стороне сервера и клиента, реестр служб и его приложения)
Обнаружение одноранговых узлов (параметры обнаружения одноранговых узлов, проблемы с членством и обнаружением сбоев, начальный узел, принцип работы протокола gossip и его приложений)
Как выбрать сетевой протокол (когда и как выбирать между TCP, UDP и HTTP)
Сетевые протоколы в реальных системах (тест: какой сетевой протокол вы бы выбрали для решения различных задач системного проектирования)
Видео по протоколу HTTP (адаптивная потоковая передача)
CDN (как ее использовать, как она работает, точка присутствия (POP), преимущества)
Технологии Push и pull (короткий опрос, длительный опрос, websocket, события, отправляемые сервером)
Нажимные технологии в реальных системах (тест: какую технологию вы бы выбрали для решения различных задач системного проектирования)
Крупномасштабные push-архитектуры (проблемы C10K и C10M, примеры крупномасштабных push-архитектур, наиболее заметные проблемы обработки долговременных соединений в больших масштабах)
Что еще нужно знать для создания надежных, масштабируемых и быстрых систем (список распространенных проблем в распределенных системах, список концепций системного проектирования, которые помогают решать эти проблемы, трехуровневая архитектура)
Тайм-ауты (быстрые сбои, медленные сбои, тайм-ауты подключения и запроса)
Что делать с неудачными запросами (стратегии обработки неудачных запросов (отмена, повторная попытка, переход на другой ресурс, запасной вариант))
Когда следует повторить попытку (проверка на идемпотентность: какие сбои AWS API можно безопасно повторить)
Как повторить попытку (экспоненциальный откат, дрожание)
Гарантии доставки сообщений (не более одного раза, не менее одного раза, ровно один раз)
Компенсации потребителям (системы обмена сообщениями на основе журналов, контрольные точки)
Пакетирование (плюсы и минусы, как обрабатывать пакетные запросы)
Сжатие (плюсы и минусы, алгоритмы сжатия и компромиссы, которые они допускают)
Как масштабировать потребление сообщений (один потребитель против нескольких потребителей, проблемы с несколькими потребителями (порядок обработки сообщений, двойная обработка))
Разделение в реальных системах (плюсы и минусы, применение разделения)
Стратегии разделения (стратегия поиска, стратегия диапазона, стратегия хэширования)
Маршрутизация запросов (физические и виртуальные сегменты, параметры маршрутизации запросов)
Перебалансировка разделов (как перебалансировать разделы)
Согласованное хеширование (как реализовать, преимущества и недостатки, виртуальные узлы, приложения согласованного хеширования)
Перегрузка системы (почему важно защищать систему от перегрузки)
Автоматическое масштабирование (политики масштабирования (на основе показателей, расписания, прогнозирования))
Разработка системы автоматического масштабирования (как спроектировать систему автоматического масштабирования)
Сброс нагрузки (как реализовать это в распределенных системах, важные соображения)
Ограничение скорости (как использовать знания, полученные в ходе курса, для решения проблемы ограничения скорости (пошаговое руководство))
Синхронные и асинхронные клиенты (системы контроля допуска, блокирующие клиенты ввода-вывода и неблокирующие клиенты ввода-вывода)
Автоматический выключатель (автомат конечного состояния автоматического выключателя, важные соображения)
Принцип отказоустойчивого проектирования (проблемы с медленными службами (цепные реакции, каскадные сбои) и способы их решения)
Переборка (как реализовать этот шаблон в распределенных системах)
Разделение в случайном порядке (как реализовать этот шаблон в распределенных системах)
Конец (список тем, которые мы рассмотрим в следующем модуле курса)
Инструктор
Привет! Это Михаил Смаршок с YouTube-канала System Design Interview (https://www.youtube.com/c/SystemDesignInterview ). Я инженер-программист со страстью к обучению, преподаванию и наставничеству. Имея более чем 15-летний опыт работы в отрасли, последние 9 лет я работал над созданием масштабируемых, высокодоступных распределенных систем с низкой задержкой. Долгое время я задавался вопросом, каков наилучший способ научиться системному дизайну. Хотя существует множество превосходных ресурсов для изучения отдельных концепций, лишь немногие дают целостное представление о том, как проектировать системы. И даже после того, как вы потратили много времени и приобрели много знаний, все еще трудно развить истинное системное дизайнерское мышление. Мышление, которое помогает ответить на такие вопросы, как: с чего начать мой дизайн; куда двигаться дальше; как разбить эту большую неясную проблему на подзадачи, которые я знаю, как решить; и даже если я не знаю ответа, могу ли я сделать обоснованное предположение? Поэтому я поставил перед собой задачу создать курс, который поможет выстроить и улучшить мышление в области системного дизайна. И два года спустя вы можете увидеть результат этой работы. Не стесняйтесь подключаться / подписываться на меня в LinkedIn, где я стараюсь регулярно публиковать больше своих мыслей и учебных материалов: www.linkedin.com/in/mikhail-smarshchok
ПРОДАЖНИК
Скрытое содержимое. Вам нужно войти или зарегистрироваться.
СКАЧАТЬ Скрытое содержимое. Вам нужно войти или зарегистрироваться.