Развёртывание — это процесс доставки новой версии программного компонента в целевую среду и её безопасного ввода в эксплуатацию.
Масштабирование — изменение доступных вычислительных ресурсов и числа экземпляров системы в соответствии с нагрузкой, требованиями надёжности и ограничениями стоимости.
В монолитной системе развёртывание часто выглядит относительно просто:
Собрать приложение
→ остановить старую версию
→ установить новую
→ запустить
В микросервисной архитектуре одновременно могут существовать:
Поэтому развёртывание становится самостоятельной архитектурной задачей.
Необходимо обеспечить:
Масштабирование также нельзя сводить только к добавлению серверов.
Необходимо определить:
Главный принцип:
Развёртывание должно быть автоматическим, повторяемым и обратимым, а масштабирование — управляться измеряемой нагрузкой и учитывать весь путь запроса, а не только количество экземпляров приложения.
Типичная система использует несколько сред:
Local
Development
Testing
Staging
Production
Среда разработчика.
Используется для:
Общая среда активной разработки.
Среда автоматических и ручных проверок.
Максимально приближена к Production.
Используется для:
Реальная рабочая среда.
Среды не должны различаться настолько сильно, чтобы тестирование переставало отражать производственное поведение.
Environment Parity означает максимальное сходство сред по:
Полная идентичность часто слишком дорога.
Но критические различия должны быть известны и документированы.
Плохо:
Development:
локальный файл и SQLite.
Production:
распределённая PostgreSQL, Redis и брокер.
Такая среда может не выявить:
Артефакт — неизменяемый результат сборки, который доставляется в среды.
Примеры:
Хорошая практика:
Один раз собрать
→ один и тот же артефакт продвигать по средам.
Плохо пересобирать приложение отдельно для Production, потому что проверенная и рабочая версии могут различаться.
Артефакт после сборки не должен изменяться.
Он получает:
Конфигурация среды передаётся отдельно.
Это позволяет точно ответить:
Код приложения не должен содержать production-настройки.
Разделяются:
Одинаковый для сред.
Зависит от окружения:
Секреты не должны храниться в обычных конфигурационных файлах или исходном коде.
Конфигурация развёртывания должна быть:
К ней относятся:
Infrastructure as Code описывает инфраструктуру декларативно или программно.
Можно управлять:
Преимущества:
Configuration Drift возникает, когда реальная инфраструктура отличается от описанной.
Причины:
Последствия:
Ручное изменение должно либо запрещаться, либо сразу переноситься в код конфигурации.
Контейнер упаковывает:
Контейнер обеспечивает единообразный запуск в разных средах.
Схема:
Container Image
├── Application
├── Runtime
└── Libraries
Контейнер не является отдельной виртуальной машиной.
Он разделяет ядро операционной системы хоста.
Но контейнеризация не исправляет:
Образ строится слоями.
Хороший образ должен быть:
Multi-stage build позволяет разделить:
Build Environment
→ Runtime Image
В итоговый образ не попадают:
Это уменьшает:
Плохой вариант:
service:latest
Непонятно, какая версия развёрнута.
Лучше:
service:2.4.1
service:commit-a82f17
Tag может быть удобным именем, но для полной неизменяемости используют digest.
Container Registry хранит образы.
Необходимо:
Цепочка поставки включает:
Исходный код
→ зависимости
→ build system
→ артефакт
→ registry
→ deployment
Риски:
Необходимы:
Software Bill of Materials — перечень компонентов артефакта:
SBOM помогает:
При большом количестве контейнеров требуется оркестратор.
Он управляет:
Оркестратор не понимает бизнес-правила сервиса автоматически.
Он управляет жизненным циклом процессов.
Kubernetes использует декларативную модель желаемого состояния.
Например:
Желаемое состояние:
3 экземпляра Order Service.
Control Plane постоянно сравнивает:
Желаемое состояние
с
Фактическим состоянием.
Если экземпляр завершился, платформа создаёт новый.
Pod — минимальная развёртываемая единица Kubernetes.
Он может содержать:
Контейнеры одного Pod:
Обычно один Pod содержит один основной сервисный процесс.
Deployment управляет stateless-приложениями.
Он определяет:
Deployment создаёт и обновляет ReplicaSet.
StatefulSet используется для stateful workloads.
Предоставляет:
Примеры:
Но managed database часто предпочтительнее самостоятельного запуска критической СУБД в оркестраторе.
DaemonSet запускает экземпляр на каждом подходящем узле.
Применяется для:
Job выполняет конечную задачу:
Он считается завершённым после успешного выполнения.
CronJob запускает Job по расписанию.
Примеры:
Нужно учитывать:
Request — ресурс, необходимый для планирования.
Например:
CPU request: 500m
Memory request: 512 MiB
Scheduler использует requests для выбора узла.
Слишком маленькие requests приводят к:
Слишком большие — к:
Limit ограничивает максимальный ресурс.
CPU limit может привести к throttling.
Превышение memory limit обычно приводит к завершению процесса по OOM.
Необходимо различать:
Если контейнер превышает memory limit, он может быть завершён.
Простой restart не устраняет причину.
Необходимо анализировать:
При достижении CPU limit процесс получает меньше процессорного времени.
Сервис может:
Поэтому необходимо наблюдать не только ошибки, но и throttling.
Liveness отвечает:
Нужно ли перезапустить контейнер?
Она должна обнаруживать:
Не следует включать в liveness проверку всех внешних зависимостей.
Иначе временный отказ базы вызовет бесконечные перезапуски всех сервисов.
Readiness отвечает:
Можно ли направлять сюда новый трафик?
Сервис может быть alive, но not ready, если:
При not ready Pod остаётся запущенным, но исключается из маршрутизации.
Startup Probe полезна для приложений с долгим запуском:
До её успеха liveness не должна преждевременно перезапускать процесс.
При завершении сервис должен:
Принудительное завершение без draining может приводить к:
Оркестратор предоставляет время на graceful shutdown.
Если сервис не завершился, процесс будет остановлен принудительно.
Время должно учитывать:
Но не должно быть бесконечно большим.
Rolling Update постепенно заменяет старые экземпляры новыми.
v1 v1 v1
→
v1 v1 v2
→
v1 v2 v2
→
v2 v2 v2
Преимущества:
Требования:
При rolling update определяются:
Сколько дополнительных экземпляров можно временно создать.
Сколько экземпляров может быть недоступно.
Например:
replicas = 10
maxSurge = 2
maxUnavailable = 1
Это влияет на:
Одновременно работают две версии.
Если новый Provider несовместим со старым Consumer или наоборот, система ломается в процессе обновления.
Необходимо соблюдать:
Все старые экземпляры останавливаются, затем запускаются новые.
Преимущества:
Недостаток:
Подходит для:
Существуют две полноценные среды:
Blue — текущая версия.
Green — новая версия.
Процесс:
Недостатки:
Даже если приложение легко переключить, обе версии часто используют одну базу.
Несовместимая миграция делает rollback невозможным.
Нужна схема:
Expand
→ deploy Green
→ migrate usage
→ observe
→ Contract later
Новая версия получает небольшую часть трафика:
99% → v1
1% → v2
Доля постепенно увеличивается:
5%
25%
50%
100%
На каждом этапе сравниваются:
Трафик можно выделять по:
Canary должен иметь автоматические критерии остановки.
Пример условия:
Если error rate новой версии
превышает базовую более чем на допустимый порог,
остановить rollout.
Дополнительно:
Технические метрики должны дополняться бизнес-метриками.
Копия production-трафика направляется новой версии.
Её ответ не используется.
Преимущества:
Риски:
Shadow-версия должна быть безопасной и не выполнять реальные необратимые команды.
A/B используется для продуктового эксперимента.
Разные группы пользователей получают разные функции.
Это не то же самое, что Canary.
Canary проверяет техническую безопасность релиза.
A/B проверяет продуктовую гипотезу.
Функция отделяется от deployment.
Код может быть развёрнут, но не активирован.
Преимущества:
Риски:
Каждый временный flag должен иметь владельца и дату удаления.
Новая функция развёрнута, но скрыта от пользователей.
Можно:
Это уменьшает риск момента включения.
Progressive Delivery объединяет:
Цель — уменьшить blast radius новой версии.
Blast Radius — масштаб влияния ошибки.
Он уменьшается через:
Не следует сразу направлять 100% критического трафика на непроверенную версию.
После развёртывания выполняются минимальные проверки:
Smoke test не заменяет полный набор тестов.
После релиза проверяются:
Успешный статус pipeline не гарантирует корректность production.
Rollback возвращает предыдущую версию приложения.
Он должен быть:
Но откат приложения может быть невозможен после несовместимого изменения данных.
Иногда безопаснее выпустить исправление вперёд, чем откатываться.
Причины:
Стратегия выбирается заранее.
Миграция схемы должна учитывать независимые и постепенные релизы.
Плохой процесс:
Удалить старую колонку
→ развернуть новую версию.
Если старая версия ещё работает, она сломается.
Безопасный процесс:
1. Добавить новую колонку.
2. Развернуть код, умеющий работать с обеими.
3. Выполнить backfill.
4. Переключить чтение и запись.
5. Убедиться, что старое поле не используется.
6. Удалить позднее.
Добавить новую совместимую структуру.
Перевести данные и версии приложения.
Удалить старую структуру после завершения перехода.
Эта стратегия особенно важна при rolling и canary deployment.
Миграции можно выполнять отдельным контролируемым процессом.
Преимущества:
Не следует разрешать всем replicas одновременно выполнять тяжёлую migration при старте.
Backfill заполняет новые данные для старых записей.
Требования:
Большой backfill может выполняться часами или днями и должен работать рядом с production-трафиком безопасно.
Новая версия может публиковать новый формат события.
Нужно учитывать старых Consumers.
Стратегии:
Нельзя предполагать, что все Consumers обновятся одновременно.
Типичный pipeline:
Checkout
→ Restore Dependencies
→ Build
→ Unit Tests
→ Static Analysis
→ Security Scan
→ Package
→ Publish Artifact
→ Deploy
→ Smoke Tests
→ Progressive Verification
Для независимого сервиса pipeline не должен всегда ждать release всей платформы.
CI означает частое объединение изменений в основную ветку с автоматической проверкой.
Преимущества:
Каждое успешное изменение потенциально готово к Production.
Production-deploy может требовать ручного одобрения.
Каждая версия, прошедшая проверки, автоматически попадает в Production.
Подходит только при:
Разработчики работают с короткоживущими ветками или основной веткой.
Большие незавершённые функции скрываются feature flags.
Это снижает:
Желаемое состояние среды хранится в Git.
Специальный controller:
Преимущества:
Секреты требуют отдельной безопасной обработки.
Для критичных систем могут использоваться:
Это не отменяет автоматизацию самого выполнения.
Ручным должно быть решение, а не копирование файлов и ввод команд.
Масштабирование может быть:
Нельзя решать все проблемы добавлением replicas.
Увеличиваются ресурсы экземпляра:
Преимущества:
Ограничения:
Добавляются экземпляры:
Service 1
Service 2
Service 3
Требования:
Stateless-сервис не хранит критическое состояние пользовательской операции в памяти конкретного экземпляра между запросами.
Это упрощает:
Состояние хранится во внешнем durable storage или передаётся в запросе.
Наличие локального кэша не обязательно делает сервис stateful в бизнес-смысле.
Если кэш можно потерять и восстановить, экземпляр остаётся заменяемым.
Необходимо, чтобы потеря кэша влияла только на производительность, а не на корректность.
Stateful workload хранит уникальное состояние, связанное с конкретным экземпляром.
Примеры:
Масштабирование требует:
Sticky session направляет пользователя в один экземпляр.
Преимущества:
Недостатки:
Предпочтительно выносить session во внешнее хранилище или токен, если это оправдано.
Load Balancer распределяет запросы.
Алгоритмы:
Выбор зависит от:
Autoscaling автоматически меняет количество экземпляров.
Источники сигналов:
CPU не всегда является правильной метрикой.
HPA изменяет число Pod на основании метрик.
Пример:
Целевая CPU:
60%.
Минимум:
3 replicas.
Максимум:
20 replicas.
Но HPA реагирует с задержкой.
Сервис должен выдерживать нагрузку до добавления новых экземпляров.
Подходит для CPU-bound нагрузок:
Плохо отражает:
Memory metric сложнее, потому что память часто освобождается не сразу.
Если приложение стабильно использует кэш, HPA может ошибочно масштабировать его вверх.
Memory scaling полезен, если потребление действительно связано с нагрузкой и экземпляры способны освободить память.
Можно масштабировать по:
запросов в секунду на экземпляр.
Это часто лучше CPU для I/O-сервисов.
Необходимо учитывать:
Для workers полезна длина очереди.
Пример:
1 worker обрабатывает 50 сообщений в минуту.
В очереди 5 000 сообщений.
Autoscaler добавляет consumers.
Но необходимо учитывать:
Для event stream ключевой сигнал — lag.
Latest offset - Consumer offset
Если lag растёт, обработка не успевает.
Но добавление consumers помогает только до числа partitions.
Если нагрузка предсказуема:
ресурсы можно увеличить заранее.
Это уменьшает задержку реактивного autoscaling.
На основании истории прогнозируется будущая нагрузка.
Подходит для стабильных повторяющихся паттернов.
Риск:
Обычно применяется вместе с реактивным scaling.
Число экземпляров уменьшается до нуля.
Подходит для:
Недостатки:
Cold Start включает:
Для latency-sensitive сервиса нужен:
Autoscaler обнаруживает нагрузку не мгновенно.
Затем требуется:
Поэтому необходимо иметь headroom.
Headroom — свободная ёмкость для внезапного роста.
Система, постоянно работающая на 100%, не успевает масштабироваться.
Запас зависит от:
Если scaling слишком чувствителен, число экземпляров постоянно меняется:
3 → 6 → 3 → 7 → 3
Это создаёт:
Нужны:
VPA может рекомендовать или менять requests/limits экземпляров.
Полезен для:
Изменение ресурсов часто требует пересоздания Pod.
VPA и HPA по CPU могут конфликтовать без правильной настройки.
Если в кластере нет места для новых Pod, добавляются вычислительные узлы.
Цепочка:
Нагрузка
→ HPA создаёт Pod
→ Pod Pending
→ Cluster Autoscaler добавляет Node
→ Pod запускается
Это значительно медленнее добавления Pod на уже свободный узел.
Capacity Planning определяет ресурсы для ожидаемой нагрузки.
Нужно знать:
Планирование строится на измерениях и моделях, а не на предположении «добавим сервер при проблеме».
Throughput — объём операций за единицу времени.
Примеры:
500 запросов в секунду.
10 000 сообщений в минуту.
Нужно измерять не только входной запрос, но и:
Среднее значение может скрывать плохой пользовательский опыт.
Используются:
Например:
p50 = 100 мс.
p99 = 4 секунды.
Небольшая доля очень медленных запросов может быть критичной.
Saturation показывает степень исчерпания ресурса:
Высокая saturation часто предшествует ошибкам.
Количество одновременно выполняемых операций связано с:
Если запросы приходят быстрее или обрабатываются дольше, растёт concurrency и очередь.
Поэтому уменьшение latency может повысить пропускную способность без добавления экземпляров.
Узким местом может быть:
Масштабирование не того компонента не даст результата.
Пример:
Добавили 20 экземпляров API,
но база выдерживает только 200 соединений.
Каждый экземпляр сервиса имеет pool соединений.
При масштабировании:
20 экземпляров × 50 соединений
= до 1000 соединений к базе.
База может не выдержать.
Нужно согласовывать:
Варианты:
Database часто масштабируется сложнее stateless API.
Чтение распределяется между replicas.
Подходит для:
Необходимо учитывать replication lag.
После записи пользователь может не увидеть изменение сразу.
Запись сложнее масштабировать.
Подходы:
Нельзя просто добавить replicas для одной writable relational database без модели координации.
Кэш уменьшает нагрузку, но добавляет:
Масштабирование кэша требует:
Много запросов одновременно обнаруживают истёкший ключ и обращаются к базе.
Защита:
Один ключ получает непропорциональную нагрузку.
Примеры:
Даже распределённый кэш может перегрузить один shard.
Задачи распределяются по ключу.
Например:
MachineId
→ определённая partition.
Это сохраняет порядок по станку.
Но число параллельных consumers ограничивается числом partitions.
Если downstream не выдерживает нагрузку, добавление producers ухудшит ситуацию.
Необходимо:
При перегрузке система отклоняет часть запросов, чтобы сохранить критическую функцию.
Можно отклонять:
Лучше быстро вернуть контролируемую ошибку, чем довести всю систему до полного отказа.
Сообщения разделяются по приоритету.
Например:
High:
управляющие команды производства.
Normal:
обычные операции.
Low:
аналитическая обработка.
Нужно предотвращать starvation низкого приоритета.
Экземпляры распределяются по зонам доступности.
Цель:
Нужно учитывать:
Критические replicas не должны оказаться на одном узле.
Если узел завершится, будут потеряны все экземпляры.
Anti-affinity или topology spread распределяет их.
Система развёртывается в нескольких регионах.
Варианты:
Сложность:
Один регион обслуживает трафик.
Второй готов к переключению.
Необходимо:
Резервная среда, которую никогда не проверяли, не является надёжной стратегией.
Несколько регионов принимают трафик одновременно.
Преимущества:
Сложности:
Disaster Recovery определяет восстановление после крупного отказа.
Нужно иметь:
Допустимая потеря данных.
Допустимое время восстановления.
Пример:
RPO: 5 минут.
RTO: 30 минут.
Чем строже показатели, тем выше стоимость архитектуры.
Проверяются сценарии:
Цель — убедиться, что механизмы восстановления действительно работают.
В критические периоды может вводиться ограничение релизов:
Freeze не заменяет надёжность, но уменьшает риск во время особо чувствительных периодов.
Для каждого rollout нужны:
На dashboard должно быть видно, когда новая версия вошла в систему.
Логи и spans должны содержать:
Это позволяет сравнивать:
Ошибки появились только после версии 2.4.1.
Если error budget почти исчерпан, автоматическая политика может:
Больше replicas означает:
Масштабирование должно учитывать не только SLA, но и стоимость.
Слишком большой запас ресурсов:
Но некоторое overprovisioning необходимо для:
Недостаточные ресурсы приводят к:
Экономия может оказаться дороже инцидентов.
Rightsizing — подбор разумных requests и limits на основании фактических метрик.
Необходимо анализировать:
FinOps связывает архитектуру, команды и стоимость.
Полезные показатели:
Команда должна видеть экономический результат масштабирования.
Ресурсы маркируются:
Это помогает определить владельца расходов и оптимизировать их осознанно.
Development и Staging могут потреблять значительную часть бюджета.
Возможные меры:
Но тестовая среда должна оставаться достаточно похожей на Production.
Для branch или pull request создаётся временная среда.
Преимущества:
Недостатки:
Preview environment может содержать:
Не всегда необходимо копировать всю платформу.
Развёртывание stateful-компонента требует:
Нельзя обновлять все узлы кластера одновременно без понимания его протокола.
Распределённому хранилищу требуется достаточное число участников.
При обновлении нельзя уменьшить доступное число ниже quorum.
Например, для трёх узлов потеря двух делает cluster недоступным.
PDB ограничивает число экземпляров, которые могут быть добровольно недоступны одновременно.
Он помогает при:
Но не защищает от аварийного отказа.
Перед обслуживанием узел:
Нужно учитывать PDB и локальные volumes.
Данные на локальном диске узла усложняют:
Для временных данных это допустимо.
Для критических данных требуется durable storage и стратегия восстановления.
Consumer должен корректно обрабатывать:
При rollout старые и новые версии могут одновременно читать очередь.
Схема сообщения должна быть совместимой.
При изменении числа consumers partitions перераспределяются.
На время rebalance обработка может задерживаться.
Долгие операции должны:
Максимальный параллелизм ограничен числом partitions.
3 partitions
→ эффективно не более 3 активных consumers группы.
Добавление десяти consumers не увеличит throughput после этого предела.
В обычной очереди можно увеличивать workers, пока downstream выдерживает.
Но возможны ограничения:
Если scheduler запущен в каждом replica, одна задача может выполниться несколько раз.
Решения:
Сама задача всё равно должна быть идемпотентной.
Edge-сервисы работают рядом с оборудованием или локальной площадкой.
Особенности:
Стратегии:
Нельзя одновременно обновлять все производственные площадки без возможности восстановления.
Edge-устройство должно иметь возможность вернуться к предыдущей версии без постоянного доступа к центру.
Варианты:
Развёртывание сервиса, управляющего оборудованием, требует более строгих мер:
Обычная стратегия «автоматически выкатывать каждую версию» может быть неприемлема.
AI-компонент может зависеть от:
Версия должна включать не только код, но и:
Ограничения:
CPU-based autoscaling часто недостаточен.
Используются:
Новый AI-instance может долго загружать модель.
Он не должен считаться ready до:
Для тяжёлых геометрических или расчётных задач подходит очередь jobs.
SubmitJob
→ Queue
→ Compute Workers
→ Result Storage
Workers масштабируются по queue depth.
Синхронный API возвращает Operation ID.
Desktop-система развёртывается иначе, чем серверный сервис.
Требуются:
Обновление может выполняться по группам пользователей.
Desktop-клиенты обновляются не одновременно.
Backend должен некоторое время поддерживать несколько версий API.
Нельзя предполагать, что все пользователи установили новую версию в день релиза.
Локальная база должна мигрироваться безопасно:
Gateway масштабируется горизонтально.
Необходимо учитывать:
Stateful rate limiting может требовать общего распределённого storage.
Registry и DNS должны быть высокодоступными.
Но клиент не должен обращаться в Registry при каждом запросе.
Используются:
Брокер масштабируется через:
Нужно учитывать:
Каждый новый replica создаёт больше логов.
Если логировать payload каждого запроса, наблюдаемость может стать:
Используются:
При большом трафике хранить все traces дорого.
Стратегии:
Ошибочные и медленные traces следует сохранять с большим приоритетом.
Полезные показатели:
Основные показатели:
Они оценивают способность команды безопасно доставлять изменения.
Доля релизов, которые приводят к:
Высокая частота релизов полезна только при низком риске отказа.
MTTR измеряет время восстановления после проблемы.
Уменьшается через:
Runbook должен описывать:
Признаки:
Ручные процедуры плохо масштабируются и трудно воспроизводятся.
Production использует:
image: latest
Невозможно точно определить или вернуть версию.
Следует использовать immutable version или digest.
Секрет, добавленный при build, остаётся в слоях образа даже после удаления из финального файла.
Секреты передаются только во время выполнения через защищённый механизм.
Все replicas одновременно пытаются изменить базу.
Это создаёт:
База временно недоступна.
Все Pods перезапускаются.
После восстановления база получает storm соединений.
Следует разделять состояние процесса и готовность обслуживать запросы.
Новый экземпляр сразу получает трафик до завершения инициализации.
Результат:
Новая версия сразу обслуживает всех пользователей.
Blast radius максимален.
Для критичных систем лучше progressive delivery.
Команда откатывает приложение, но старая версия не понимает новую схему.
Rollback должен проектироваться совместно с migration strategy.
Сервис ожидает медленную базу, CPU низкий, очередь растёт.
HPA не масштабирует.
Нужно выбирать метрики, отражающие реальную работу.
Autoscaler создаёт сотни экземпляров, которые перегружают базу или внешний API.
Нужны:
Добавление экземпляров временно скрывает утечку, но каждый новый экземпляр позже завершится.
Нужно исправлять причину.
Планировщик размещает много Pod на узле.
При реальной нагрузке узел перегружается.
Возникают:
Кластер простаивает, но новые Pod не помещаются.
Стоимость растёт.
Нужно выполнять rightsizing.
Планируется:
1000 запросов в секунду
но система никогда не проверялась при такой нагрузке.
Нагрузочный тест должен охватывать:
Workers масштабируются медленно, а очередь растёт бесконечно.
Нужны:
Все сервисы имеют по три replicas, но Gateway один.
Фактическая доступность определяется самым слабым обязательным компонентом.
Формально сервис масштабирован, но отказ узла уничтожает все экземпляры.
Нужно topology spread.
Два региона одновременно меняют одни данные.
Не определено:
Active-active требует предметной модели согласования.
Небольшая система из двух сервисов получает сложный кластер, который команда не умеет поддерживать.
Оркестратор оправдан, если его преимущества превышают операционную стоимость.
Возможны альтернативы:
Критерии:
Компоненты:
API Gateway: 3 replicas.
Order Service: 6 replicas.
Payment Service: 4 replicas.
Inventory Service: 5 replicas.
Notification Workers: autoscaling 2–30.
Order Service масштабируется по request rate.
Notification Workers — по queue depth.
Payment Service имеет ограничение по rate внешнего провайдера, поэтому max replicas не должен превышать безопасную общую нагрузку.
Этапы:
Возможная модель:
Central Services
├── Planning
├── Inventory
├── Tool Management
└── Reporting
Site Edge
├── Site Gateway
├── Machine Adapters
└── Local Queue
Central Services масштабируются в серверном кластере.
Edge-компоненты развёртываются по площадкам и должны работать при потере центральной связи.
Процесс:
Вместо масштабирования одного API используются:
Основной сигнал autoscaling — ingress rate и consumer lag.
Он может иметь два режима:
Синхронный быстрый подбор
→ stateless API replicas.
Тяжёлый анализ
→ job queue + compute workers.
API масштабируется по request rate.
Workers — по queue depth и длительности задачи.
Маршрутизатор принимает запрос.
Inference workers могут быть:
Масштабирование учитывает:
Собирайте артефакт один раз и продвигайте его между средами.
Храните конфигурацию отдельно, а секреты — в защищённом хранилище.
Автоматизируйте deployment и rollback.
Используйте readiness, liveness и graceful shutdown по их реальному назначению.
Выполняйте эволюционные совместимые миграции данных.
Снижайте blast radius через canary и progressive delivery.
Масштабируйте по метрике, отражающей реальную нагрузку.
Учитывайте capacity баз, брокеров и внешних сервисов.
Распределяйте replicas по узлам и зонам.
Связывайте техническую масштабируемость с наблюдаемостью и стоимостью.
После изучения урока обучающийся должен уметь ответить:
Развёртывание микросервисов должно быть:
Основные стратегии:
Rolling Update
Blue-Green
Canary
Shadow
Feature Flags
Progressive Delivery
Выбор стратегии зависит от:
Масштабирование может быть:
Vertical
Horizontal
Scheduled
Reactive
Predictive
Geographical
Но добавление экземпляров эффективно только тогда, когда остальные компоненты пути также выдерживают рост нагрузки.
Необходимо учитывать:
Для управляемого scaling нужны:
Главный принцип можно сформулировать следующим образом:
Новая версия должна вводиться небольшим контролируемым изменением с ясной возможностью восстановления, а новые ресурсы должны добавляться на основании измеряемого узкого места и с учётом ограничений всей системы.