System Design Space
Граф знанийНастройки

Обновлено: 25 марта 2026 г. в 01:00

Monolith to Microservices (short summary)

medium

Переход от монолита почти никогда не бывает heroic rewrite; сильные команды режут систему кусками, сохраняя право на откат.

Для реального проектирования глава помогает увидеть, как Strangler Fig, Branch by Abstraction, поэтапный split базы и измеримые checkpoints превращают миграцию из разовой ставки в управляемую программу изменений.

Для интервью и инженерных разборов она полезна тем, что помогает обсуждать миграцию через dual-write риски, rollback-пути и цену каждого шага, а не через красивую целевую картинку сервисов.

Практическая польза главы

Практика проектирования

Используйте strangler-подход и branch-by-abstraction для безболезненного выделения сервисов.

Качество решений

Снижайте migration-risk через slice-by-slice extraction и измеримые checkpoints.

Interview articulation

Аргументируйте, почему big-bang миграция опасна и где нужен controlled coexistence.

Failure framing

Закладывайте rollback, dual-write risk control и plan для DB split.

Companion Book

Building Microservices

Теория и целевое состояние микросервисной архитектуры — что строить, а эта книга о том, как туда прийти.

Читать обзор

Monolith to Microservices (От монолита к микросервисам)

Авторы: Sam Newman
Издательство: O'Reilly Media, 2019
Объём: 272 страниц

Разбор книги Sam Newman: Strangler Fig, Branch by Abstraction, разделение БД и практические паттерны миграции.

Оригинал
Перевод

Зачем отдельная книга о миграции?

Greenfield vs Brownfield

"Building Microservices" описывает идеальный мир. Но 90% проектов — это legacy-системы, которые нужно трансформировать, не останавливая production.

Инкрементальная миграция

Книга даёт конкретные паттерны для постепенного перехода — без "big bang" переписывания и с минимальным риском для бизнеса.

Структура книги

Главы 1-2

Зачем мигрировать? Когда НЕ мигрировать? Планирование миграции.

Главы 3-4

Паттерны декомпозиции кода и разделения базы данных.

Глава 5

Проблемы роста и организационные аспекты миграции.

Глава 1: Просто достаточно микросервисов

Три ключевые идеи микросервисов

1. Independent Deployability

Возможность деплоить сервис без координации с другими командами — главный критерий правильных микросервисов.

2. Моделирование по домену

Границы сервисов = границы бизнес-доменов. DDD и Bounded Contexts как основа.

3. Владение данными

Каждый сервис владеет своими данными и скрывает их за API. Нет shared database.

Типы монолитов

Single-Process

Весь код в одном deployable unit. Самый распространённый тип.

Modular Monolith

Внутри разбит на модули, но деплоится как единое целое. Хороший промежуточный вариант!

Distributed Monolith

Худший вариант — формально сервисы, но все тесно связаны. Сложность обоих миров.

Глава 2: Планирование миграции

Когда НЕ нужны микросервисы?

  • Непонятный домен — сначала поймите бизнес
  • Стартап — скорость важнее архитектуры
  • Маленькая команда — overhead перевесит пользу
  • Нет DevOps культуры — сначала CI/CD и мониторинг

Как выбрать первый сервис для выделения?

КритерийОписание
Низкое зацеплениеМинимум зависимостей от других частей системы
Чёткие границы данныхПонятно, какие таблицы "принадлежат" этому домену
Команда готоваЕсть люди, способные владеть сервисом end-to-end
Бизнес-ценностьВыделение даст измеримые преимущества

Связанная книга

Learning Domain-Driven Design

Полное руководство по DDD: Event Storming, Context Maps, strategic patterns для декомпозиции.

Читать обзор

Domain-Driven Design для декомпозиции

Event Storming

  • Собираем domain experts и разработчиков
  • Выявляем domain events (оранжевые стикеры)
  • Группируем в Bounded Contexts
  • Находим границы будущих сервисов

Context Maps

  • Shared Kernel — общий код
  • Customer-Supplier — upstream/downstream
  • Anticorruption Layer — защита от legacy
  • Conformist — подстраиваемся под внешний API

Глава 3: Паттерны декомпозиции

Strangler Fig Pattern

Главный паттерн миграции — постепенное "обвивание" монолита новыми сервисами, пока от старой системы ничего не останется.

1️⃣

Proxy

Ставим proxy перед монолитом

2️⃣

Intercept

Перехватываем нужные вызовы

3️⃣

Redirect

Направляем в новый сервис

4️⃣

Remove

Удаляем код из монолита

Branch by Abstraction

Для выделения функционала изнутри монолита:

1. Создать абстракцию

Интерфейс вокруг выделяемого кода

2. Новая реализация

Микросервис, реализующий интерфейс

3. Переключение

Feature toggle → удаление старого кода

Parallel Run

Запускаем старую и новую реализацию параллельно, сравниваем результаты:

Как работает:

  • Вызываем обе реализации
  • Сравниваем результаты
  • Логируем расхождения
  • Возвращаем результат "старой" версии

Когда использовать:

  • Критичный функционал (платежи)
  • Сложная логика с edge cases
  • Нужна уверенность в корректности

Decorating Collaborator

Добавляем новый функционал через прокси-сервис, не меняя монолит. Полезно для cross-cutting concerns: логирование, аудит, обогащение данных.

Глава 4: Разделение базы данных

Почему это самая сложная часть?

Shared database — главное препятствие к независимому деплою. Пока сервисы используют общую БД, они не являются настоящими микросервисами.

Проблемы shared DB:

  • Изменение схемы требует координации
  • Нет чётких границ владения данными
  • Производительность одного влияет на всех
  • Невозможно масштабировать независимо

Цель:

  • Каждый сервис владеет своими данными
  • Данные доступны только через API сервиса
  • Можно менять схему без координации
  • Можно выбирать подходящую СУБД

Паттерны разделения данных

Database View

  • Создаём view поверх таблиц монолита
  • Новый сервис читает через view
  • Скрываем детали схемы
  • Только для чтения!

Database Wrapping Service

  • API-сервис перед shared таблицами
  • Все обращаются только через API
  • Потом переносим таблицы в сервис
  • Хороший промежуточный шаг

Synchronize Data in Application

  • Дублируем данные в новую БД
  • Синхронизируем через application code
  • Переключаемся на новую БД
  • Удаляем синхронизацию

Change Data Capture (CDC)

  • Debezium, AWS DMS
  • Стримим изменения в реальном времени
  • Минимальное влияние на монолит
  • Eventual consistency

Работа с транзакциями

После разделения БД теряем ACID транзакции между сервисами. Альтернативы:

Saga Pattern

Цепочка локальных транзакций с компенсирующими действиями при ошибке.

Outbox Pattern

Атомарно записываем данные + событие в одну БД, затем публикуем.

Idempotency

Безопасные повторные вызовы с помощью idempotency keys.

Глава 5: Проблемы роста

Типичные ошибки при миграции

  • Слишком много сервисов сразу — начните с 1-2
  • Игнорирование ownership — кто будет поддерживать?
  • Shared database надолго — создаёт distributed monolith
  • Нет observability — не видите что происходит

Организационные аспекты

"If you have four teams working on a compiler, you'll get a 4-pass compiler."

— Conway's Law

Inverse Conway Maneuver:

Сначала реорганизуйте команды по доменам, потом мигрируйте код.

You Build It, You Run It:

Команда, которая пишет сервис, отвечает за его работу в production.

Ключевые выводы

Do:

  • Инкрементальная миграция, а не big bang
  • Strangler Fig как основной паттерн
  • Сначала modular monolith, потом микросервисы
  • Выделять БД сервиса как можно раньше

Don't:

  • Мигрировать всё сразу
  • Shared database между сервисами надолго
  • Мигрировать без понимания домена
  • Начинать без observability

Для кого эта книга?

Идеально подходит:

  • Командам с legacy монолитом
  • Архитекторам, планирующим миграцию
  • Tech leads, ищущим практические паттерны
  • Всем, кто уже прочитал "Building Microservices"

Связь с другими книгами:

  • Building Microservices — теория и целевое состояние
  • Monolith to Microservices — как туда добраться
  • DDIA — глубокое понимание распределённых данных

Совет: Эта книга — идеальный companion к "Building Microservices". Первая книга рассказывает что такое микросервисы, вторая — как к ним прийти из существующего монолита.

Связанные главы

Где найти книгу

Чтобы отмечать прохождение, включи трекинг в Настройки