Оглавление
Предисловие.................................................................................. 12
Кому стоит прочесть эту книгу..................................................... 12
Зачем я написал эту книгу........................................................... 12
Современный мир распределенных систем.................................. 13
Как ориентироваться в книге....................................................... 14
Условные обозначения ................................................................ 15
Онлайн-ресурсы .......................................................................... 16
Использование примеров кода .................................................... 16
Благодарности............................................................................. 17
Глава 1. Введение ......................................................................... 18
Краткая история разработки систем ............................................ 19
Краткая история паттернов проектирования в разработке ПО..... 21
Формализация алгоритмического программирования........ 21
Паттерны в объектно-ориентированном
программировании........................................................22
Расцвет программного обеспечения с открытым
исходным кодом................................................................ 23
Ценность паттернов, практик и компонентов............................... 24
Стоя на плечах гигантов ................................................... 24
Общий язык обсуждения подходов к разработке............... 25
Общие повторно используемые компоненты ..................... 26
Резюме........................................................................................ 27
Оглавление 7
Часть I. Одноузловые паттерны проектирования
Мотивация................................................................................... 30
Резюме........................................................................................ 32
Глава 2. Паттерн Sidecar ............................................................... 34
Пример реализации паттерна Sidecar. Добавление
возможности HTTPS-соединения к унаследованному сервису ...... 35
Динамическая конфигурация с помощью паттерна Sidecar .......... 36
Модульные контейнеры приложений ........................................... 39
Практикум. Развертывание контейнера topz...................... 40
Создание простейшего PaaS-сервиса на основе
паттерна Sidecar ................................................................ 42
Разработка модульных и повторно используемых
реализаций паттерна Sidecar....................................................... 43
Параметризованные контейнеры....................................... 44
Определение API всех контейнеров .................................. 45
Документирование контейнеров........................................ 47
Резюме........................................................................................ 49
Глава 3. Паттерн Ambassador ........................................................ 50
Использование паттерна Ambassador
для шардирования сервиса...................................................51
Практикум. Шардируем Redis-хранилище .......................... 54
Использование паттерна Ambassador для реализации
сервиса-посредника..................................................................... 57
Использование паттерна Ambassador для проведения
экспериментов и разделения запросов ........................................ 59
Практикум. Реализация 10%-ных экспериментов .............. 60
Глава 4. Адаптеры ......................................................................... 64
Мониторинг ................................................................................. 66
Практикум. Мониторинг с помощью Prometheus ................ 67
8 Оглавление
Ведение журналов....................................................................... 69
Практикум. Нормализация форматов журналов
с помощью fluentd............................................................. 70
Мониторинг работоспособности сервисов.................................... 72
Практикум. Комплексный мониторинг
работоспособности MySQL ................................................ 73
Часть II. Паттерны проектирования
обслуживающих систем
Введение в микросервисы ........................................................... 78
Глава 5. Реплицированные сервисы с распределением нагрузки ... 82
Сервисы без внутреннего состояния............................................ 82
Датчики готовности для балансировщика нагрузки........... 84
Практикум. Создание реплицированного сервиса
с помощью Kubernetes....................................................... 85
Сервисы с закреплением сессий .................................................. 87
Сервисы с репликацией на уровне приложения........................... 89
Добавляем кэширующую прослойку ............................................ 89
Развертывание кэширующего сервера .............................. 90
Практикум. Развертывание кэширующей прослойки.......... 92
Расширение возможностей кэширующей прослойки .................... 95
Ограничение частоты запросов и защита от атак типа
«отказ в обслуживании» (DoS).......................................... 95
SSL-мост............................................................................ 96
Практикум. Развертывание nginx и SSL-моста.................... 98
Резюме...................................................................................... 101
Глава 6. Шардированные сервисы ............................................... 102
Шардирование кэша.................................................................. 103
Зачем вам нужен шардированный кэш............................ 104
Оглавление 9
Роль кэша в производительности системы ...................... 105
Реплицированный и шардированный кэш........................ 107
Практикум. Развертывание реализации паттерна
Ambassador и сервиса memcache
для организации шардированного кэша ..................... 108
Шардирующие функции ............................................................ 114
Выбор ключа................................................................... 115
Консистентные хеш-функции .......................................... 117
Практикум. Построение консистентного
шардированного прокси-сервера .................................... 118
Шардирование реплицированных сервисов ............................... 119
Системы с «горячим» шардированием....................................... 120
Глава 7. Паттерн Scatter/Gather ................................................... 122
Scatter/Gather с распределением нагрузки
корневым узлом ........................................................................ 123
Практикум. Распределенный поиск в документах ............ 125
Scatter/Gather с шардированием терминальных узлов ............... 126
Практикум. Шардированный поиск в документах ............ 128
Выбор подходящего количества терминальных узлов ..... 129
Масштабирование Scatter/Gather-систем с учетом
надежности и производительности............................................ 132
Глава 8. Функции и событийно-ориентированная обработка ....... 134
Как определить, когда полезен подход FaaS.............................. 135
Преимущества FaaS......................................................... 136
Проблемы разработки FaaS-систем.................................. 136
Потребность в фоновой обработке.................................. 138
Необходимость хранения данных в памяти ..................... 138
Стоимость постоянного использования
запросно-ориентированных вычислений ......................... 139
10 Оглавление
Паттерны FaaS........................................................................... 140
Паттерн Decorator. Преобразование запроса
или ответа...................................................................... 140
Практикум. Подстановка значений по умолчанию
до обработки запроса..................................................... 142
Обработка событий......................................................... 144
Практикум. Реализация двухфакторной
аутентификации.............................................................. 145
Событийные конвейеры .................................................. 147
Практикум. Реализация конвейера для регистрации
нового пользователя....................................................... 148
Глава 9. Выбор владельца ........................................................... 151
Как определить, нужен ли выбор владельца ............................. 152
Основы процесса выбора владельца.......................................... 155
Практикум. Развертывание etcd ...................................... 157
Реализация блокировок .................................................. 159
Практикум. Реализация блокировок в etcd ...................... 163
Реализация владения...................................................... 164
Практикум. Реализация аренды в etcd............................. 166
Параллельный доступ к данным ................................................ 167
Часть III. Паттерны проектирования систем
пакетных вычислений
Глава 10. Системы на основе очередей задач ............................. 173
Система на основе обобщенной очереди задач ......................... 173
Интерфейс контейнера-источника................................... 174
Интерфейс контейнера-исполнителя............................... 177
Общая инфраструктура очередей задач.......................... 179
Практикум. Реализация генератора миниатюр
видеофайлов............................................................................. 182
Оглавление 11
Динамическое масштабирование исполнителей......................... 184
Паттерн Multi-Worker ................................................................. 187
Глава 11. Событийно-ориентированная пакетная обработка ....... 189
Паттерны событийно-ориентированной обработки .................... 191
Паттерн Copier ................................................................ 191
Паттерн Filter .................................................................. 192
Паттерн Splitter............................................................... 193
Паттерн Sharder.............................................................. 194
Паттерн Merger ............................................................... 196
Практикум. Создание событийно-ориентированного
потока задач для регистрации нового пользователя................ 198
Инфраструктура publish/subscribe .............................................. 201
Практикум. Развертывание Kafka............................................... 202
Глава 12. Координированная пакетная обработка ....................... 205
Паттерн Join (барьерная синхронизация)................................... 206
Паттерн Reduce ......................................................................... 207
Практикум. Подсчет ........................................................ 209
Суммирование................................................................. 210
Гистограмма.................................................................... 211
Практикум. Конвейерная разметка
и обработка изображений.....................................................212
Глава 13. Заключение — новое начало? ..................................... 217
Об авторе ....................................................................................... 220
Об иллюстрации на обложке .......................................................... 221