Microservices и Distributed Systems: Модули
Программа разбирает основные трудности распределённых систем в рамках реальных решений: где проводить границы сервисов, как определять, кто владеет данными, и как жить с сетевыми сбоями. Открыто обсуждается и то, что микросервисы — не всегда ответ, и разбираются случаи, когда модульный монолит предпочтительнее.
01
Границы сервисов
Учимся делить сервисы по бизнес-возможностям, а не по техническим слоям.
- Bounded context и основы domain-driven design
- Признаки границы: частота изменений и владение командой
- Виды связности и ловушка распределённого монолита
- Постепенное разделение подходом strangler
- Модульный монолит как альтернатива
Лабораторная: Предложить разделение на сервисы для заданной монолитной системы заказов и сравнить две альтернативы в таблице компромиссов.
02
Владение данными
Отвечаем на вопрос, как строить запросы и отчёты, когда каждый сервис владеет своими данными.
- База данных на сервис и риски общей базы
- Дублирование данных и read model
- API composition и введение в CQRS
- Жизнь без ссылочной целостности между сервисами
- Миграция данных и владение схемой
Лабораторная: Разделить два сервиса, использующих общую таблицу: провести границу владения и написать поэтапный план переноса данных.
03
Синхронное и асинхронное взаимодействие
Сравниваем последствия выбора REST, gRPC или обмена сообщениями.
- REST и gRPC: различия контракта и производительности
- Обмен сообщениями и взаимодействие через события
- Временная связность и расчёт доступности
- Контрактные тесты (consumer-driven contract)
- Роль API gateway и BFF
Лабораторная: Построить один и тот же рабочий процесс синхронно и асинхронно и сравнить доступность и задержку.
04
Работа со сбоями
Сеть ненадёжна; проектируем систему так, чтобы она правильно на это реагировала.
- Бюджет timeout и каскадный сбой
- Retry, exponential backoff и jitter
- Circuit breaker, bulkhead и load shedding
- Ключи идемпотентности
- Введение в chaos-эксперименты
Лабораторная: Внедрить сбои в сервис и сравнить поведение системы без timeout и circuit breaker и с ними.
05
Saga и модели согласованности
Работаем с компенсирующими потоками и eventual consistency вместо распределённых транзакций.
- Strong и eventual consistency
- Saga: choreography и orchestration
- Компенсирующие действия и необратимые шаги
- Transactional outbox
- Как показывать пользователю частичное состояние
Лабораторная: Построить saga для сервисов заказа, оплаты и склада и тестами проверить компенсацию при сбое оплаты.
06
Distributed tracing и наблюдаемость
Делаем видимым, что происходит, когда один запрос проходит через несколько сервисов.
- Trace, span и propagation контекста
- Инструментирование через OpenTelemetry
- Correlation ID между сервисами
- Карта сервисов и анализ зависимостей
- Алертинг на основе SLO
Лабораторная: Настроить OpenTelemetry в потоке из трёх сервисов и найти по трейсу источник замедления.
07
Развёртывание: контейнеры и концепции Kubernetes
Концепции, нужные, чтобы упаковать и запустить сервис, без погружения в администрирование кластера.
- Слои Docker image и компактные image
- Концепции Deployment, Service и ConfigMap
- Liveness и readiness probe
- Resource request/limit и согласование памяти JVM
- Rolling update и откат
Лабораторная: Контейнеризировать сервис, написать манифест deployment и понаблюдать последствия неверно настроенных probe.
08
Когда модульный монолит лучше
Честно оцениваем реальную цену выбора микросервисов и альтернативы.
- Цена операционной сложности
- Размер команды и закон Конвея
- Дисциплина границ внутри модульного монолита
- Запись архитектурного решения (ADR)
Лабораторная: Для заданного сценария компании сравнить монолит, модульный монолит и микросервисы в формате ADR и записать решение.