Мастер-класс "Разработка надежных высоконагруженных систем"

Создавая мастер-класс "Разработка надежных высоконагруженных систем", я старался ответить на вопрос: что необходимо сделать, чтобы система масштабировалась при увеличении нагрузки в два, десять, сто раз? При условии ограниченности ресурсов этот вопрос далеко не простой, универсального ответа на него не существует, но понимая основные принципы построения архитектур веб-приложений и зная о доступных решениях, можно найти ответ, который подходит для каждой конкретной системы.

Тема надежности находится очень близко к теме высоких нагрузок: это и отказоустойчивость, избыточность, надежность хранения данных, разворачивание системы в нескольких дата-центрах. Моя задача - дать такой набор знаний и приемов, чтобы после мастер-класса участник мог построить подходящую архитектуру самостоятельно. Это не будет курс о тюнинге 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

Comments powered by Disqus
Contents © 2015 Andrey - Powered by Nikola