Распределенные системы. Паттерны проектирования
Современный мир попросту немыслим без использования распределенных систем. Даже у простейшего мобильного приложения есть API, через который оно подключается к облачному хранилищу. Однако, проектирование распределенных систем до сих пор остается искусством, а не точной наукой. Необходимость подвести под нее серьезный базис назрела давно, и, если вы хотите обрести уверенность в создании, поддержке и эксплуатации распределенных систем - начните с этой книги!
Брендан Бёрнс, авторитетнейший специалист по облачным технологиям и Kubernetes, излагает в этой небольшой работе абсолютный минимум, необходимый для правильного проектирования распределенных систем. Эта книга описывает неустаревающие паттерны проектирования распределенных систем. Она поможет вам не только создавать такие системы с нуля, но и эффективно переоборудовать уже имеющиеся.
Предисловие...................................................................................12
Кому стоит прочесть эту книгу......................................................12
Зачем я написал эту книгу............................................................12
Современный мир распределенных систем...................................13
Как ориентироваться в книге........................................................14
Условные обозначения.................................................................15
Онлайн-ресурсы...........................................................................16
Использование примеров кода.....................................................16
Благодарности..............................................................................17
Глава 1. Введение .......................................................................... 18
Краткая история разработки систем.............................................19
Краткая история паттернов проектирования в разработке ПО......21
Формализация алгоритмического программирования.........21
Паттерны в объектно-ориентированном программировании.................22
Расцвет программного обеспечения с открытым исходным кодом......23
Ценность паттернов, практик и компонентов................................24
Стоя на плечах гигантов....................................................24
Общий язык обсуждения подходов к разработке................25
Общие повторно используемые компоненты......................26
Резюме.........................................................................................27
Часть 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
Ведение журналов........................................................................ 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
Роль кэша в производительности системы....................... 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
Паттерны 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
Динамическое масштабирование исполнителей.......................... 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