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

Первый выделенный сервис должен доказать, что монолит способен передать ответственность и сохранить управляемость. Выбирайте сервис по владению данными и риску развертывания, а не по аккуратности блока на схеме. Пакет с общими таблицами, синхронными вызовами и одной большой транзакцией остается частью монолита во всем, что влияет на эксплуатацию.
Я видел, как команды выносили самый изолированный на вид код, радовались чистому репозиторию, а потом обнаруживали: каждый релиз требует согласованного изменения базы и ночного звонка трем владельцам. Сервис существовал как процесс, но не как самостоятельная эксплуатационная единица. Первый настоящий сбой в продакшене вернул его прямо в монолит.
У хорошего первого кандидата мало путей записи, данные могут получить одного понятного владельца, вызывающие компоненты переносят сетевую границу, а релиз можно отменить без ручного ремонта данных. На архитектурной схеме такой кандидат может выглядеть скучно. Это полезно, пока команда выясняет реальное поведение своей системы.
Начните с владельца данных, а не с бизнес-термина
Лучший первый сервис владеет связным набором фактов и может отклонить запись, не обращаясь к половине монолита. Это требование строже, чем наличие классов Billing, Customer или Inventory. За бизнес-термином часто скрываются процессы, отчеты, права и исторические таблицы, которые разные ветви программы меняют по разным причинам.
Спросите, какой компонент может стать единственным источником истины для небольшого набора записей. Владение означает, что компонент проверяет изменения, фиксирует их, назначает идентификаторы и публикует результат. Другие части системы могут кешировать или копировать эти факты, но больше не меняют главные строки. Если и монолит, и новый сервис остаются законными авторами, вместо границы вы получили распределенную гонку.
Сначала проследите записи, затем чтения. Чтение обычно проще дублировать, кешировать или обслуживать через представление совместимости. Записи раскрывают правила, которые поддерживают корректность данных. Проверьте прикладной код, хранимые процедуры, задания по расписанию, триггеры базы, скрипты импорта, инструменты поддержки и прямые команды операторов. В старых системах решающие записи часто спрятаны там, где основной репозиторий их не показывает.
Подходящий кандидат может владеть запросами на формирование документов, настройками уведомлений, снимками валютных курсов или завершенными заданиями экспорта. У этих примеров ограниченный переход состояния, и они часто допускают асинхронную обработку. Плохой первый кандидат обычно называется клиентом, заказом, счетом или правом доступа, если его записи участвуют в каждой важной транзакции. Позже эти области можно выделить, но начинать с них означает проходить самый трудный урок по самой высокой цене.
Не путайте группу таблиц с предметной областью. Если на таблицу ссылаются двенадцать внешних ключей, два триггера обновляют другие агрегаты, а ночное задание исправляет данные, перенос таблицы не создает независимости. Он лишь перемещает центр сети зависимостей. Документация PostgreSQL описывает внешние ключи как зависимости между ссылающимися и целевыми строками. Эта гарантия действует локально в транзакции базы. Когда таблицы оказываются за разными сервисами, приложение должно осознанно заменить гарантию либо принять более слабую согласованность.
Измеряйте связанность по данным выполнения
Статический граф зависимостей дает отправную точку, но только продакшен показывает, выдержит ли кандидат границу процессов. Добавьте наблюдение в монолит и соберите сведения о вызывающих компонентах, формах запросов, частоте записи, длительности транзакций, размере данных, чувствительности к задержкам, повторах и пиках нагрузки. Важная единица здесь не исходный файл, а запрос или задание, пересекающее будущую границу.
Составьте реестр кандидатов, по строке на каждый предполагаемый сервис. Запишите таблицы чтения и записи, всех потребителей, участие вызова в пользовательском запросе, допустимость ожидания после сбоя и инварианты, которые сейчас держатся на одной транзакции базы. Добавьте владельца развертывания и действие для отката. Если в одной из этих ячеек стоит «решим позже», кандидат не готов.
Поиск по репозиторию пропустит динамический SQL, рефлексию, сгенерированные запросы и программу, развернутую вне репозитория. Журналы запросов и трассировка базы находят такие пути. Наблюдайте достаточно долго, чтобы увидеть расчеты, выставление счетов, сверку, архивирование и закрытие месяца. Спокойная во вторник конечная точка может стать центром системы в последний рабочий день месяца.
Считайте операции через границу, а не вызовы методов. Разговорчивый метод репозитория может выполнить двадцать запросов и при этом чисто переехать вместе со своими данными. Безобидный getter может участвовать в транзакции, которая блокирует строки четырех областей. В документации PostgreSQL по явным блокировкам сказано, что SELECT FOR UPDATE блокирует конфликтующие обновления и запросы блокировки до конца транзакции. Замена локального ожидания удаленным вызовом меняет время, виды ошибок и поведение взаимных блокировок, даже если возвращаются те же поля.
Считайте неизвестный трафик риском, а не нулем. Если журналы не показывают, кто обновляет таблицу, сначала добавьте наблюдение. Обнаружить автора помогут прокси, временный аудит-триггер или метка трассировки в слое доступа к данным. Догадка экономит время лишь до момента, когда неизвестный автор перезапишет состояние нового сервиса.
Собранные данные должны отвечать на четыре неудобных вопроса. Может ли сервис быть недоступен, не блокируя главную транзакцию? Может ли потребитель повторить запрос без дублирования работы? Может ли оператор назвать главную копию записи? Может ли команда отключить маршрут и сохранить внутреннюю согласованность обоих хранилищ? Идеальные ответы на все вопросы не обязательны, но для каждого слабого ответа нужен проверенный предохранитель.
Чистая схема может скрывать плохой первый разрез
Отбрасывайте кандидатов, чья привлекательность основана главным образом на организационной аккуратности. Команды часто выбирают модуль, потому что им уже владеет одна группа, пространство имен выглядит чисто или схема поставщика называет его ограниченным контекстом. Ни один из этих фактов не доказывает, что программу можно развернуть отдельно.
Аутентификация часто становится ловушкой. Она выглядит горизонтальной и самостоятельной, но от ее задержки и доступности зависит каждый запрос. В данных могут смешиваться учетные сведения, сессии, роли, членство в арендаторах, история аудита и процедуры восстановления. Такое выделение бывает оправдано, однако для репетиции оно плохо подходит: одна ошибка маршрутизации способна закрыть вход всей компании.
Общие справочные данные создают другую ловушку. Модуль с кодами стран или категориями товаров кажется доступным только для чтения, пока администраторы не меняют его, кеши не обновляются в разное время, а бизнес-правила не требуют применить изменение в той же транзакции. Объем мал, но охват огромен. Низкий трафик не означает низкий риск развертывания.
Отчетный код выглядит безопаснее, потому что отчеты редко меняют основные записи. Скрытая цена состоит во владении запросами. Отчет, который соединяет тридцать таблиц монолита, не становится независимым после обертывания того же SQL в HTTP. Он превращается в удаленный сервис запросов, привязанный ко всем читаемым схемам. Проекцию для отчетов можно выделить после определения ее потока данных и допустимой задержки. Перенос существующих соединений лишь добавляет сетевой переход.
Я не советую «сначала выделить самый простой модуль». Рекомендация популярна, потому что быстрое разделение репозитория дает видимый результат и новый конвейер развертывания. Она ошибочна, когда простота касается лишь перемещения программы. Выбирайте ответственность, которую легче всего независимо эксплуатировать вместе с данными, сбоями, развертыванием, наблюдением и возвратом. Такое определение дает больше знаний и меньше показной активности.
Риск развертывания важнее размера сервиса
У маленького сервиса может быть огромная зона поражения, а большой асинхронный обработчик способен тихо остановиться и позже разобрать очередь. Ранжируйте кандидатов по последствиям плохого релиза. Объем программы слабо отражает риск. Доля критических запросов, пересекающих границу, говорит гораздо больше.
Предпочитайте кандидата вне синхронного пути входа, оплаты, авторизации или главного обновления записи. Рассылка уведомлений, преобразование файлов, формирование экспортов и индексация документов часто подходят лучше, потому что монолит может поставить работу в очередь и продолжить. Такие задачи остаются важными. Просто команда получает время на наблюдение, повтор и исправление, а сбой сервиса не превращается в общий отказ.
Проверьте и связанность ресурсов. Новый процесс может перегрузить ту же базу другим пулом соединений, агрессивнее повторять медленный запрос или исчерпать общую очередь. Разделение на схеме развертывания не разделяет процессор, блокировки, соединения и квоты следующих систем. Ограничьте параллелизм и повторы до переключения продакшен-трафика.
Оценивайте кандидата по последствиям, понятным операторам:
- Десятиминутный простой менее опасен, если работа подождет и догонит; ошибка основных запросов служит тревожным признаком.
- Главные данные должен писать один компонент; несколько приложений и заданий создают опасность.
- Стабильный ключ идемпотентности делает повтор безопаснее; слепое повторение опасно.
- Релиз должно отменять переключение маршрута или потребителя; слияние данных и откат схемы опасны.
- Смысловую ошибку должны находить сравнение результатов и бизнес-метрики; одного состояния процесса мало.
Не превращайте таблицу в ложную числовую формулу. Оценка 17 не отменяет ответ «мы не можем восстановить пропущенные записи». Таблица нужна, чтобы выявить условия для запрета и провести предметное обсуждение. Для первой экстракции необратимое расхождение данных запрещает запуск. То же относится к зависимости, которая требует развернуть всех потребителей в одном окне.
Опишите контракт до переноса реализации
Контракт экстракции должен задавать поведение при повторах, устаревших и дублированных входных данных, тайм-аутах и частичных сбоях. Перечня конечных точек и полей мало. Потребителям нужно знать, какой идентификатор запроса остается стабильным, какой переход состояния разрешен и какой ответ означает, что сервис надежно принял ответственность.
Записывайте контракт по существующему поведению, включая неприятные части. Если монолит принимает повторную отправку и возвращает исходное задание, новый сервис не должен отвечать конфликтом только потому, что так чище. Модернизируйте после появления видимых доказательств паритета или через явно версионированное изменение. Иначе каждое отличие вызовет спор о том, какой результат считался правильным.
Для задания экспорта минимальный запрос делает правило повтора конкретным:
{
"request_id": "01JEXAMPLE8M4Q2",
"account_id": "A1842",
"report_type": "ledger",
"cutoff": "2026-08-01T00:00:00Z"
}
До начала работы сервис сохраняет request_id под уникальным ограничением. Повторный запрос возвращает существующее задание и его текущее состояние. Тайм-аут после приема становится восстанавливаемым: потребитель повторяет тот же идентификатор вместо создания нового задания. В контракте также нужны конечное состояние ошибки и правило, позволяющее или запрещающее оператору повтор с той же идентичностью.
Описывайте ошибки через действие потребителя. «Неверная дата среза, не повторять» дает понятную инструкцию. «Зависимость недоступна, повторить с ограниченной задержкой» тоже. Общая внутренняя ошибка толкает всех потребителей к самой опасной реакции, немедленному слепому повтору. Укажите пределы размера и времени запроса в контракте, иначе их обнаружит в продакшене самый большой исторический ввод.
Первая граница должна быть уже старого внутреннего API. Не выставляйте таблицы через универсальные конечные точки создания, чтения, обновления и удаления. Предлагайте операции, сохраняющие инварианты, например request_export, cancel_pending_export и get_export_status. Узкая поверхность команд позволяет менять детали реализации без повторной координации всех потребителей.
Один автор предотвращает раздвоение данных
В миграции должен быть объявлен момент, когда новый сервис становится единственным автором своих записей. Двойная запись из прикладного кода не дает безопасного моста. Одна запись может завершиться, а вторая получить тайм-аут, после чего потребитель не знает, исправит повтор состояние или создаст дубликат.
Передавайте владение поэтапно. Сначала сделайте скрытых авторов видимыми и направьте их через один интерфейс монолита. Затем введите стабильные идентификаторы запросов и запишите прежнее поведение. Пусть новый сервис обрабатывает копию трафика, не публикуя результаты. После успешных проверок паритета направьте главные записи в сервис, а чтение монолита оставьте на пути совместимости. Уберите старого автора после закрытия окна возврата. Это единая последовательность миграции, а не пять отдельных проектов.
Если монолит должен реагировать на зафиксированное сервисом изменение, публикуйте событие в той же транзакции базы, где хранится изменение. Обычно применяют транзакционный исходящий буфер: сервис вместе фиксирует состояние области и строку буфера, затем передатчик публикует строку. Потребители все равно должны выдерживать дубликаты, поскольку передатчик может опубликовать событие и упасть до отметки о завершении.
Не используйте внешние ключи между сервисами. Они не обеспечат целостность между разными базами, а общая база сохранит связанность развертываний. Передавайте идентификатор ссылки, проверяйте его там, где этого требует процесс, и определите поведение при удалении или устаревании копии. Некоторым инвариантам нужна синхронная проверка у владельца, другим достаточно локальной проекции. Решение следует записать в контракте области, а не оставлять случайному соединению таблиц.
Для начальной загрузки данных нужны контрольная позиция и запрос сверки. Подход «скопировать таблицу, затем переключить» оставляет гонку между снимком и текущими записями. Захватите изменения после известной позиции, загрузите снимок, примените изменения по порядку и сравните количество строк с итогами области или хешами. Равное количество строк не обнаружит переставленные значения, пропавшие связи или новое значение по умолчанию с другим смыслом.
В плане переключения для каждой фазы должны быть названы старая и новая стороны владения. Если во время инцидента руководитель вынужден определять владельца по панелям при продолжающейся записи, план провалился еще до начала инцидента.
Теневой трафик должен сравнивать смысл
Теневое развертывание дает больше доказательств, когда сравнивает результаты предметной области, а не одни коды состояния. Отправляйте копию подходящих продакшен-запросов новому сервису, изолируйте побочные эффекты и записывайте нормализованные результаты обеих реализаций. Затем классифицируйте отличия по полям и бизнес-правилам.
До сравнения нормализуйте недетерминированные значения. Метки времени, сгенерированные идентификаторы, неупорядоченные коллекции и форматирование могут различаться без изменения поведения. Не скрывайте нормализацией значимые поля: денежное округление, решения о правах, обещанный потребителю порядок или момент перехода состояния. Для каждого правила нормализации нужны владелец и причина.
Записанный продакшен-трафик находит сочетания, которых нет в тестовых наборах, но в нем есть конфиденциальные данные и исторические случайности. До сбора определите срок хранения, доступ, маскирование и управление повторным воспроизведением. В регулируемой среде размещение стенда внутри периметра клиента может быть важнее удобства облачной тестовой системы. Поддержка такой среды не означает наличие сертификата соответствия. Это разные утверждения.
Сравнивайте побочные эффекты через приемник. Не позволяйте теневому сервису отправлять настоящую почту, списывать средства или публиковать главные события. Замените адаптеры регистраторами намерений. Полезное сравнение звучит так: «новая реализация отправила бы это событие с такими полями», а не «обработчик вернул 202».
Установите условия продвижения по наблюдаемому поведению. Охватите обычный объем, предельные данные, повторы, неверный ввод, тайм-ауты зависимостей и найденные при анализе задания. Для инвариантов денег, прав и постоянного состояния не допускайте необъясненных отличий. Косметические расхождения форматирования лучше явно принять, чем делать вид, будто нужна побайтовая идентичность.
При переписывании старой системы CodeHero использует стенд паритета с записанным продакшен-трафиком. Я потребовал бы этот элемент, даже если замену строила другая команда. Состояние процесса показывает, что новая программа работает. Доказательства паритета показывают, выполняет ли она прежнюю задачу.
Откат должен менять маршрут, а не чинить историю
Безопасный откат прекращает новый трафик к выделенному сервису и не заставляет операторов сливать две противоречивые истории. Это свойство проектируют до переключения. Если для возврата нужно обратно преобразовать данные, восстановить общую таблицу или заново развернуть всех потребителей, при неясном сбое времени не хватит.
На период наблюдения сохраните старый путь чтения, но не двух неограниченных авторов. Когда записями владеет новый сервис, передавайте его зафиксированные изменения в совместимое хранилище монолита либо заставьте монолит читать через сервис. Первый вариант дает быстрый возврат чтения при видимой задержке репликации. Второй сохраняет одну истину, но добавляет доступность сервиса в старый путь. Выбирайте по тому простою, который система выдержит.
Используйте управление маршрутом, независимое от развертывания приложения. Оно может находиться в шлюзе, назначении потребителя или серверной конфигурации. Защитите его контролем доступа и журналом аудита. До переключения проверьте точную процедуру возврата под нагрузкой, включая выполняющиеся запросы и сообщения в очереди.
Задайте наблюдаемые условия отката. Рост частоты ошибок не замечает смысловую порчу. Добавьте расхождения паритета, возраст очереди, долю дубликатов, отклоненные переходы и итоги области. Назначьте человека с правом на откат и ответственного за диагностику после переноса трафика. Экстренное совещание не заменяет плоскость управления.
Изменения схемы должны сохранять совместимость на протяжении окна возврата. Добавляйте поля до того, как сделаете их обязательными, принимайте старое и новое представление во время работы обеих версий, а старые поля удаляйте позже. Скрипты отката базы успокаивают на бумаге, но развернуть назад разрушительную миграцию после новых записей часто невозможно. Совместимые вперед изменения сохраняют реальную возможность переключить маршрут.
Не называйте каждый отход поражением. Если маршрут переключился, доказательства сохранились, а команда нашла смысловое отличие до появления клиентской зависимости, механизм экстракции сработал. Поражение наступает, когда назад ведет лишь импровизированное редактирование данных.
Для продвижения нужны владельцы, пороги и срок
Переключение готово, когда названные люди могут по текущим доказательствам решить, продолжить его, приостановить или отменить. Приглашение в календаре и панель не дают такой способности. Команде нужна эксплуатационная запись, связывающая каждый сигнал с действием, а действие с ответственной ролью.
Подготовьте лист продвижения до запуска теневого трафика. Укажите версию кандидата, управление маршрутом, контрольную позицию данных, режим совместимости, ожидаемую глубину очереди, допустимое изменение задержки, правила паритета и человека с правом двигать трафик. Запишите точные команды или действия для каждой ступени и возврата. Если процедура зависит от памяти одного инженера о недокументированном флаге, репетируйте до устранения зависимости.
Переносите трафик долями, которые показывают влияние нагрузки, не создавая нового владельца данных на каждой стадии. Для чтения без состояния может хватить процентного распределения. Работу с состоянием направляйте по стабильному признаку, например идентификатору счета, типу задания или арендатору, чтобы одна единица не прыгала между реализациями. Сохраняйте назначение. Случайное процентное распределение связанных записей может разделить процесс между двумя владельцами и сделать сбой прерывистым.
Время важно в двух смыслах. Новый сервис должен увидеть достаточно представительной работы, а у каждой стадии должен быть максимальный срок до явного решения. Бесконечный частичный выпуск рискует стать постоянной архитектурой с двумя панелями, двумя инструкциями и неясным владельцем. Определяйте момент решения по трафику, а не по терпению руководства. Сервис с важной ежедневной обработкой должен пройти ее до продвижения. Для квартального пути используйте записанное воспроизведение, если ждать живого события неразумно.
Разделяйте инфраструктурные и смысловые пороги. Насыщение процессора, исчерпание соединений, рост очереди и тайм-ауты показывают способность выдержать нагрузку. Итоги состояния, количество переходов, округления, решения о правах и предполагаемые эффекты показывают правильность поведения. Быстрый и неверный релиз следует остановить раньше, чем временно медленный и правильный.
Во время выпуска ведите короткую запись решения:
- Владелец релиза записывает долю трафика и позицию данных до смены маршрута.
- Наблюдатель подтверждает показатели инфраструктуры и паритета для этой доли.
- Владелец области относит каждое новое смысловое отличие к объясненным, блокирующим или принятым с письменной причиной.
- Владелец инцидента подтверждает возможность возврата с текущей схемой и очередью.
- Владелец релиза продвигает, удерживает или отменяет выпуск и записывает использованные доказательства.
Это не пустая церемония. Запись предотвращает знакомый сценарий: инфраструктура выглядит здоровой, выпуск продвигается, а необъясненное бизнес-отличие оставляют следующей смене, потому что никто не вправе остановить процесс. Неопределенность становится видимой, пока возврат еще дешев.
Заведите отдельные сроки для технического восстановления и восстановления данных. Вернуть маршрут можно за секунды, а повторно воспроизвести пропущенные события или построить проекцию дольше. Укажите обе цели. Если считать откат законченным сразу после возврата запросов в монолит, незавершенный ремонт останется скрытым, а доказательства могут удалить слишком рано.
Продвижение заканчивается после очистки владения. Удалите временные пути двойного чтения, отзовите устаревшие права в базе, сохраните результаты сравнения по принятой политике, обновите каталог сервисов и маршрут дежурства. Оставленные миграционные права превращают контролируемый мост в неофициальный постоянный интерфейс. Следующая экстракция должна начинаться с меньшим числом скрытых путей.
Первая экстракция проверяет систему миграции
Первый сервис успешен, если организация может повторить метод с лучшими доказательствами и меньшей координацией. Бизнес-эффект важен, но есть и второй результат: проверенная система миграции с поиском зависимостей, фиксацией контракта, воспроизведением трафика, переносом данных, условиями продвижения и обратимым маршрутом.
Запишите, где план разошелся с продакшеном. Возможно, хранимая процедура владела записью, которую не нашел поиск. Возможно, повторы не использовали один идентификатор. Возможно, предельные данные пришли из квартального задания. Превратите каждый сюрприз в автоматический запрос, трассу или условие для следующего кандидата. Ретроспектива без измененного контроля сохраняет только рассказ.
После запуска сохраняйте эксплуатационную независимость сервиса. Дайте ему отдельный развертываемый артефакт, технические и предметные сигналы, пределы ресурсов, владельца дежурства и инструкцию для зависшей работы. Не требуйте релиза монолита для изменения реализации сервиса. Не превращайте его базу в удобную отчетную схему для новых потребителей. Каждый прямой читатель создает будущую проблему экстракции.
Модернизация архитектуры должна следовать наблюдаемому поведению, а не переносить старые модули в новые процессы строка за строкой. Полный анализ исходников помогает, потому что поведение старой системы часто пересекает языки, хранимые процедуры, пакетные файлы и клиентскую часть. CodeHero читает эти источники вместе и выполняет переписывание менее чем за 30 дней, но скорость не отменяет одного владельца данных и проверки возврата.
Выбирайте кандидата с ограниченными последствиями сбоя, одним возможным владельцем записей и потребителями, способными пересечь сетевую границу без распределенной транзакции. Докажите это записанным трафиком и один раз верните маршрут до настоящего переключения. У команды, которая никогда не выполняла возврат, есть документ об откате, но нет способности откатиться.
Вопросы
Какой сервис лучше первым выделить из монолита?
Выбирайте ответственность с понятным владельцем данных, малым числом путей записи и сбоем, который не блокирует главную транзакцию. Асинхронные экспорты или обработка документов часто подходят лучше, чем клиенты, заказы или аутентификация.
Нужно ли первым выделять самый простой модуль?
Только если его также легко независимо эксплуатировать. Чистый модуль с общими таблицами и транзакциями легко перенести, но трудно отдельно выпускать, наблюдать и откатывать.
Может ли новый сервис сначала использовать базу монолита?
Он может временно делить инфраструктуру, но должен единолично владеть записываемыми строками. Два законных автора создают неопределенность, а внешние ключи через границу сохраняют связанность развертываний.
Как найти скрытых авторов базы до экстракции?
Совместите поиск по репозиторию с журналами запросов, трассировкой, проверкой триггеров, списком заданий и операторскими скриптами. Наблюдайте полный бизнес-цикл, чтобы увидеть редкую сверку и закрытие месяца.
Почему двойная запись опасна при миграции сервиса?
Первая операция может зафиксироваться, пока вторая завершится тайм-аутом, и потребитель не поймет, исправит повтор состояние или создаст дубликат. Используйте одного автора, стабильные ключи идемпотентности и транзакционный исходящий буфер.
Что означает независимость данных для микросервиса?
Сервис единолично проверяет и фиксирует изменения своих записей. Другие компоненты могут хранить проекции или кеши, но не редактируют главный экземпляр напрямую.
Как проверить паритет поведения после экстракции?
Воспроизведите представительный трафик в изолированном теневом развертывании и сравните нормализованные результаты области и предполагаемые эффекты. Кодов состояния и здоровья процесса мало, если могут разойтись деньги, права или постоянное состояние.
Что позволяет легко отменить экстракцию сервиса?
Переключение маршрута или потребителя останавливает трафик, пока одна главная история остается целой. Совместимые схемы, видимая задержка репликации и отрепетированная обработка текущей работы сохраняют доступность этого переключателя при инциденте.
Достаточно ли паттерна Strangler Fig для безопасного разделения монолита?
Он дает полезную стратегию маршрутизации, но не решает владение данными, границы транзакций и повторы. Дополните фасад явным владельцем записи, доказательствами паритета и проектом отката.
Как долго сохранять старую реализацию?
Оставьте ее на определенное окно наблюдения с обычным трафиком, пиками, повторами и важными заданиями. Удаляйте ее после прохождения условий продвижения и устранения необъясненного поведения, а не по произвольной дате.