У меня более чем 15 лет опыта работы в индустрии, и в течение последних 9 лет я занимался созданием масштабируемых, высокодоступных и быстродействующих распределенных систем. Долгое время я задавался вопросом, как наиболее эффективно изучать системное проектирование. Хотя существует много отличных ресурсов для изучения отдельных концепций, но немногие предоставляют голистическое представление о том, как проектировать системы. И даже после того, как вы вложили много времени и получили много знаний, все еще трудно развивать истинное мышление системного проектирования. Мышление, которое помогает ответить на вопросы: с чего начать мой дизайн; куда идти дальше; как разбить эту большую неясную проблему на подзадачи, которые я знаю, как решить; и даже если я не знаю ответа, могу ли я сделать обоснованный предположение? Поэтому я бросил себе вызов создать курс, который может помочь развивать и улучшать мышление системного проектирования. И через два года вы можете увидеть результат этой работы.
Требования к системе (функциональные и нефункциональные требования)
Функциональные требования (как определить, метод «работать назад»)
Высокая доступность (доступность на основе времени и количества, принципы проектирования, процессы и метрики SLA и SLO)
Обеспечение сопровождаемости, безопасности и экономичности (аспекты сопровождаемости, аспекты безопасности (тройственность CIA, управление идентификацией и разрешениями, защита инфраструктуры и данных), аспекты экономичности (разработка, обслуживание, оборудование, программное обеспечение))
Список наиболее популярных нефункциональных требований
Регионы, зоны доступности, центры данных, стойки, серверы (как оборудование помогает достигать определенных качеств)
Физические серверы, виртуальные машины, контейнеры, серверы без серверов (преимущества и недостатки различных вычислительных сред, для чего они подходят)
Синхронное и асинхронное взаимодействие (модели синхронного и асинхронного запрос-ответа, асинхронная передача сообщений)
Асинхронные шаблоны обмена сообщениями (очередь сообщений, издатель/подписчик, конкурирующие потребители, запрос/ответ, приоритетная очередь, проверка прав)
Сетевые протоколы (TCP, UDP, HTTP, запрос и ответ HTTP)
Блокировка vs неблокировка I/O (сокет (блокировка и неблокировка), соединение, модель потока на соединение, модель потока на запрос с неблокировкой I/O, модель событийного цикла, параллелизм vs конкурентность)
Форматы кодирования данных (текстовые vs бинарные форматы, опции обмена схемами, обратная совместимость, прямая совместимость)
Подтверждение сообщений (безопасные и небезопасные режимы подтверждения)
Кэш дедупликации (локальный vs внешний кэш, добавление данных в кэш (явно, неявно), вытеснение кэш-данных (основанное на размере, основанное на времени, явное), истечение vs обновление)
Кэш метаданных (шаблон кэш-отложенного выполнения, шаблоны чтения и записи, запись с отложенным выполнением (отложенная запись))
Очередь (ограниченные и неограниченные очереди, циклический буфер (кольцевой буфер) и его применение)
Проблемы полной и пустой очереди (управление нагрузкой, ограничение скорости, что делать с неудачными запросами, обратное давление, эластичное масштабирование)
Начните с чего-то простого (сходство между концепциями одиночной машины и распределенной системы, совет для интервью)
Блокирующая очередь и шаблон производитель-потребитель (шаблон производитель-потребитель, ожидание и уведомление, семафоры, приложения блокирующей очереди)
Пул потоков (преимущества и недостатки, задачи, связанные с ЦП и вводом-выводом, плавное завершение работы)
Архитектура больших вычислений (модель пакетной обработки, задачи, легко распараллелимые)
Логи (память vs диск, сегментация лога, позиция сообщения (offset))
Индекс (эффективная реализация индекса для системы обмена сообщениями)
Хранение и извлечение данных временных рядов в масштабе и с низкой задержкой
Простая база данных "ключ-значение" (как построить простую базу данных "ключ-значение", компактификация логов)
B-дерево (как базы данных и системы обмена сообщениями используют B-деревья)
Встроенная база данных (встроенная vs удаленная база данных)
RocksDB (мемтаблица, журнал записи перед таблицей с отсортированными строками (SSTable))
LSM-дерево vs B-дерево (структура данных слияния логов, усиление записи, усиление чтения)
Кэш страницы (как увеличить производительность диска (пакетная обработка, чтение без копирования))
Push vs Pull (плюсы и минусы обеих моделей)
Обнаружение хоста (DNS, anycast)
Обнаружение сервиса (паттерны обнаружения на стороне сервера и клиента, реестр сервисов и его применение)
Обнаружение узлов (варианты обнаружения узлов, проблемы обнаружения и сбоев, seed-узел, применение протокола gossip и его применение)
Как выбрать сетевой протокол (когда и как выбирать между TCP, UDP и HTTP)
Сетевые протоколы в системах реальной жизни (тест: какой сетевой протокол вы выберете для различных проблем дизайна систем)
Видео через HTTP (адаптивное потоковое воспроизведение)
CDN (как использовать, как работает, точки присутствия (POP), преимущества)
Технологии Push и Pull (короткий опрос, длинный опрос, WebSocket, события, отправленные сервером)
Технологии Push и Pull в системах реальной жизни (тест: какую технологию вы выберете для различных проблем дизайна систем)
Архитектуры для передачи данных на больших масштабах (проблемы C10K и C10M, примеры архитектур, проблемы обработки долгоживущих соединений на большой масштабе).
Как создать надежные, масштабируемые и быстрые системы (список распространенных проблем в распределенных системах, список концепций проектирования систем, которые помогают решать эти проблемы, трехуровневая архитектура).
Таймауты (быстрые и медленные отказы, таймауты соединения и запроса).
Как обрабатывать неудачные запросы (стратегии обработки неудачных запросов (отмена, повтор, переключение, откат)).
Когда повторять (идемпотентность, тест: какие ошибки AWS API безопасны для повторной попытки).
Как повторять (экспоненциальная задержка, джиттер).
Групповая обработка запросов (плюсы и минусы, как обрабатывать групповые запросы).
Сжатие (плюсы и минусы, алгоритмы сжатия и компромиссы, которые они делают).
Как масштабировать потребление сообщений (один потребитель против нескольких потребителей, проблемы с несколькими потребителями (порядок обработки сообщений, двойная обработка)).
Разбиение в реальных системах (плюсы и минусы, применение разбиения).
Привет! Меня зовут Михаил Смарщок, я создатель канала System Design Interview на YouTube (https://www.youtube.com/c/SystemDesignInterview). Я программист и преподаватель, который увлечен обучением и наставничеством. У меня более 15 лет опыта работы в индустрии, из них последние 9 лет я работал над созданием масштабируемых, высокодоступных и систем с низкой задержкой. Я давно задумывался о том, как наилучшим образом изучать системный дизайн. Хотя
Hey, looks like the download link is broken. can anyone please verify?
CourseHunter Team
srummy123
You can download it now!
gaurav.tcs15
Just curious where is the second module - can anyone help ?
Course ended at pretty abruptly - and there are no further lectures or updates
Anonymous
gaurav.tcs15
hasn't been released yet by the Author
kucherenko.web
Please, learn English if you use English, damn shame
Umaru
Great course! learned a lot
anonymous
Михаил прошареный персонаж. Курс отличный.
vdevdn
Great content, thank you!
hazartilirot
Whyyyyyyyyyyyyyy are there so many dislikes? Is it somehow connected with the language the author speaks in? Oh Gosh.... Please, express yourself in any language you're comfortable with. I'm just curious about your reasoning.
vaduga
hazartilirot
exactly. He's not using the language he is comfortable with
hazartilirot
vaduga
I hope mate you are able to articulate in English as clear as he does in the video. Obviously, he has a strong Russian accent while speaking a foreign language, but his level is quite decent anyway. Share your video with us and we would judge how your English in comparison with the author's. I am looking forward to watching your video. Step into the light! Do not be shy. :D
vaduga
hazartilirot
просто заметил, без обид. Автору комфортно разговаривать на русском английскими словами. Не понимаю, как можно знать язык на таком уровне и совсем не попадать в интонации. Будто живую речь не слышал.
Course ended at pretty abruptly - and there are no further lectures or updates