СПб.: Питер, 2019. — 224 с. — ISBN: 978-5-4461-0950-0.
Современный мир попросту немыслим без использования распределенных систем. Даже у простейшего мобильного приложения есть API, через который оно подключается к облачному хранилищу. Однако проектирование распределенных систем до сих пор остается искусством, а не точной наукой. Необходимость подвести под нее серьезный базис назрела давно, и, если вы хотите обрести уверенность в создании, поддержке и эксплуатации распределенных систем — начните с этой книги!
ПредисловиеКому стоит прочесть эту книгу
Зачем я написал эту книгу
Современный мир распределенных систем
Как ориентироваться в книге
Условные обозначения
Онлайн-ресурсы
Использование примеров кода
Благодарности
ВведениеКраткая история разработки систем
Краткая история паттернов проектирования в разработке ПО
Формализация алгоритмического программирования
Паттерны в объектно-ориентированном программировании
Расцвет программного обеспечения с открытым исходным кодом
Ценность паттернов, практик и компонентов
Стоя на плечах гигантов
Общий язык обсуждения подходов к разработке
Общие повторно используемые компоненты
Резюме
Одноузловые паттерны проектированияМотивация
Резюме
Паттерн SidecarПример реализации паттерна Sidecar. Добавление возможности HTTPS-соединения к унаследованному сервису
Динамическая конфигурация с помощью паттерна Sidecar
Модульные контейнеры приложений
Практикум. Развертывание контейнера topz
Создание простейшего PaaS-сервиса на основе паттерна Sidecar
Разработка модульных и повторно используемых реализаций паттерна Sidecar
Параметризованные контейнеры
Определение API всех контейнеров
Документирование контейнеров
Резюме
Паттерн AmbassadorИспользование паттерна Ambassador для шардирования сервиса
Практикум. Шардируем Redis-хранилище
Использование паттерна Ambassador для реализации сервиса-посредника
Использование паттерна Ambassador для проведения экспериментов и разделения запросов
Практикум. Реализация 10%-ных экспериментов
АдаптерыМониторинг
Практикум. Мониторинг с помощью Prometheus
Ведение журналов
Практикум. Нормализация форматов журналов с помощью fluentd
Мониторинг работоспособности сервисов
Практикум. Комплексный мониторинг работоспособности MySQL
Паттерны проектирования обслуживающих системВведение в микросервисы
Реплицированные сервисы с распределением нагрузкиСервисы без внутреннего состояния
Датчики готовности для балансировщика нагрузки
Практикум. Создание реплицированного сервиса с помощью Kubernetes
Сервисы с закреплением сессий
Сервисы с репликацией на уровне приложения
Добавляем кэширующую прослойку
Развертывание кэширующего сервера
Практикум. Развертывание кэширующей прослойки
Расширение возможностей кэширующей прослойки
Ограничение частоты запросов и защита от атак типа «отказ в обслуживании» (DoS)
SSL-мост
Практикум. Развертывание nginx и SSL-моста
Резюме
Шардированные сервисыШардирование кэша
Зачем вам нужен шардированный кэш
Роль кэша в производительности системы
Реплицированный и шардированный кэш
Практикум. Развертывание реализации паттерна Ambassador и сервиса memcache для организации шардированного кэша
Шардирующие функции
Выбор ключа
Консистентные хеш-функции
Практикум. Построение консистентного шардированного прокси-сервера
Шардирование реплицированных сервисов
Системы с «горячим» шардированием
Паттерн Scatter/GatherScatter/Gather с распределением нагрузки корневым узлом
Практикум. Распределенный поиск в документах
Scatter/Gather с шардированием терминальных узлов
Практикум. Шардированный поиск в документах
Выбор подходящего количества терминальных узлов
Масштабирование Scatter/Gather-систем с учетом надежности и производительности
Функции и событийно-ориентированная обработкаКак определить, когда полезен подход FaaS
Преимущества FaaS
Проблемы разработки FaaS-систем
Потребность в фоновой обработке
Необходимость хранения данных в памяти
Стоимость постоянного использования запросно-ориентированных вычислений
Паттерны FaaS
Паттерн Decorator. Преобразование запроса или ответа
Практикум. Подстановка значений по умолчанию до обработки запроса
Обработка событий
Практикум. Реализация двухфакторной аутентификации
Событийные конвейеры
Практикум. Реализация конвейера для регистрации нового пользователя
Выбор владельцаКак определить, нужен ли выбор владельца
Основы процесса выбора владельца
Практикум. Развертывание etcd
Реализация блокировок
Практикум. Реализация блокировок в etcd
Реализация владения
Практикум. Реализация аренды в etcd
Параллельный доступ к данным
Паттерны проектирования систем пакетных вычисленийСистемы на основе очередей задачСистема на основе обобщенной очереди задач
Интерфейс контейнера-источника
Интерфейс контейнера-исполнителя
Общая инфраструктура очередей задач
Практикум. Реализация генератора миниатюр видеофайлов
Динамическое масштабирование исполнителей
Паттерн Multi-Worker
Событийно-ориентированная пакетная обработкаПаттерны событийно-ориентированной обработки
Паттерн Copier
Паттерн Filter
Паттерн Splitter
Паттерн Sharder
Паттерн Merger
Практикум. Создание событийно-ориентированного потока задач для регистрации нового пользователя
Инфраструктура publish/subscribe
Практикум. Развертывание Kafka
Координированная пакетная обработкаПаттерн Join (барьерная синхронизация)
Паттерн Reduce
Практикум. Подсчет
Суммирование
Гистограмма
Практикум. Конвейерная разметка и обработка изображений
Заключение — новое начало?Об авторе
Об иллюстрации на обложке