Мастер-класс "Разработка надежных высоконагруженных систем"
Создавая мастер-класс "Разработка надежных высоконагруженных систем", я старался ответить на вопрос: что необходимо сделать, чтобы система масштабировалась при увеличении нагрузки в два, десять, сто раз? При условии ограниченности ресурсов этот вопрос далеко не простой, универсального ответа на него не существует, но понимая основные принципы построения архитектур веб-приложений и зная о доступных решениях, можно найти ответ, который подходит для каждой конкретной системы.
Тема надежности находится очень близко к теме высоких нагрузок: это и отказоустойчивость, избыточность, надежность хранения данных, разворачивание системы в нескольких дата-центрах. Моя задача - дать такой набор знаний и приемов, чтобы после мастер-класса участник мог построить подходящую архитектуру самостоятельно. Это не будет курс о тюнинге MySQL или о настройке отказоустойчивого nginx, но мы будем говорить о том, почему MySQL устроен так, как он устроен, какие из этого вытекают характеристики, и, соответственно, что делать, чтобы заставить его работать быстрее. Мы поговорим о том, почему nginx использует несколько процессов и асинхронный сетевой ввод-вывод, а также о том, как может быть обеспечена отказоустойчивость прокси-сервера без состояния.
Курс ориентирован на разработчиков веб-приложений (серверная часть, предоставляющая API, и клиентская - HTML/JS/Deskop/Mobile). Теоретический рассказ перемешивается с анализом существующих продуктов, примерами архитектур высоконагруженных и отказоустойчивых систем, я задаю вопросы, ответы на которые мы ищем вместе, решаем задания по проектированию и выполняем небольшие практические задания.
Курс состоит из нескольких частей, на каждом этапе мы решаем одну из задач, связанных c разработкой веб-систем:
- базовая часть любой системы - хранение данных, принципы хранения, от встроенной базы данных до распределенного хранилища;
- application server (backend) - организация многозадачности, прикладные frameworkи, безопасность;
- взаимодействие - переход от монолитной архитектуры с сервис-ориентированной, от очередей до RPC и паттернов взаимодействия;
- клиентское приложение - сложность мобильного или web-приложения может быть даже выше, чем серверной части; как написать клиента так, чтобы вся система в целом была надежной и масштабируемой?
- вопросы тестирования с одной стороны крайне важны, а с другой окружены мифами о том, что они могут решить все проблемы;
- когда разработка завершена, осталось все собрать вместе, пришло время эксплуатации и обеспечения отказоустойчивости.
Программа мастер-класса
Мастер-класс рассчитан на 3 дня, 8 часов в день (с учетом перерывов 9,5-10 часов). В рамках мастер-класса предлагается 7 практических заданий, для их выполнения потребуются минимальные навыки программирования.
День первый
Немного теории. Нагрузка, характеристики нагрузки. Запросы, задержка, конкурентность, отказы. Характеристики нагрузки. Экономика высоконагруженной системы. Ресурсы и их ограниченность. Успех проекта как его способность масштабироваться. Базовая архитектура веб-проекта. Компоненты, связь между ними, надёжность системы как функция надёжности отдельных компонентов.
Данные. Реляционные базы данных. Key-Value, не-SQL базы данны. Принципы хранения данных: ACID, CAP-теорема. Проектирование схемы реальной БД в различных моделях данных.
День второй
Данные (продолжение). Индексы, денормализация, использование разных типов хранилищ для разных данных. Целостность, отказоустойчивость, доступность в распределённых хранилищах. Масштабирование данных: репликация, шардирование, деление. Кеширование данных: инвалидация кеша, тегирование. Полнотекстовый поиск.
Приложение. Структура серверного и клиентского приложения, анализ узких и проблемных мест. Сетевой ввод-вывод: синхронный, асинхронный. Реактор, обслуживание большого чила соединений (C10K, C100K). Многозадачность: процессы, нити, кооперативная многозадачность, комбинации. Архитектура современных серверов, многоядерные системы, NUMA. Краткий обзор языков программирования и фреймворков: Ruby, Ruby on Rails. Python, Tornado, Twisted, gevent. Go. Java.
Взаимодействие. Архитектура системы: монолитная, сервис-ориентированная (SOA). Непосредственный вызов (RPC), очереди, персистентные очереди, очереди фоновых задач.
День третий
Взаимодействие (продолжение). Шины, широковещательные каналы. Протоколы: HTTP, SSL, Websockets. Сериализация данных. Сжатие данных.
Разработка клиентского приложения. Синхронизация данных, работа в offline, информирование пользователя. Сетевое взаимодействие с сервером.
Тестирование. Нагрузочное и системное тестирование. Непрерывное тестирование, постоянное выкатывание.
Отказоустойчивость и эксплуатация. Резервное копирование, репликация. Master-slave. Hot-spare. Несколько DC, схемы Active-Failover, Master-Slave, Active-Active. Обеспечение консистентности. Протоколы голосования. Выбор между «облаком» и железом. Выкатывание проекта, управление конфигурацией. Мониторинг. Логирование.
Отзывы
В двух мастер-классах летом этого года приняло участие 43 человека, вот некоторые из их отзывов:
«Крайне подробный курс, включающий в себя ровно столько информации, сколько достаточно для аргументированного принятия тех или иных решений. Количество информации в каждой из областей близко к границе понятия "необходимо и достаточно". Лучший неуниверситетский курс, который я когда-либо видел.»
—Евгений Кузовлев
«Всё отлично. Очень много разных тем. При этом все подробно. При этом все что непонятно, быстро и подробно объясняется.»
—Иван Ремизов
Комментарии
Comments powered by Disqus