
Монолит до мультитенантного SaaS в 4 спринтах-не требуется переписать
5 июля 2025 г.Можете ли вы превратить хрупкое приложение Legacy в мультитенантную SaaS, не переписывая его с нуля? Мы только что сделали. В четырех спринтах наша команда возобновила семилетнюю монолит электронной коммерции как платформу на основе подписки, основанную на Angular 19 SSR, узел 20 + фазвии и Terraform Cloud. Это после того, как работало все, что взорвалось на наших лицах, и контрольный список миграции в пасту. Возьмите кофе: 8-минутное чтение.
1 - Зачем даже мигрировать? (Подсказка: деньги и скорость) ☕
Показатель | До | После | Дельта |
---|---|---|---|
Ежемесячный выпуск Cadence | 1 / месяц | 12 / месяц | × 12 |
Инфра затрат / арендатор | € 165 | € 97 | -41 % |
LCP 75th P (поле) | 4,1 с | 1,9 с | -54 % |
Чистый промоутер | 34 | 65 | +31 |
ROI Kicker:Каждое 1 секундное падение LCP увеличило конверсию воронки на 6 %. Числа сделали финансирование очень, очень счастливыми.
2 - Аудит монстра в 3 измерениях 🕵
Перед прикосновением к коду мы запустили3-D AuditПолем Оцените каждый модуль1 → 5:
Измерение | 5 = симптомы красной зоны |
---|---|
Сцепление | Поперечный импорт, контроллеры жира, запутанные angularjs & jquery |
Тестовое покрытие | <10 % тренируется |
Радиус взрыва | Миграции БД необратимы, Prod Config отличается от постановки |
Эмпирическое правило:Все, что забивает ≥ 4, попадает в отставание «Чанглера на рис.
3 - Выбор архитектуры: модульный монолит + флаги функций 🚀
ПочемунетМикро-сервисы сразу?
Вариант | ⏱ скорость отправки | 🔒 Изоляция арендатора | 👷 Совластные бремени OPS |
---|---|---|---|
Поднят и сдвиг докер | ⚡ быстро | 😰 Минимальный | 😀 Низкий |
Модульный монолит + флаги | 🔄 Сбалансирован | 🙂 Хорошо | 🟡 Средний |
Микро-сервисы (DDD) | 🐢 медленно | 😎 Отлично | 🔴 High |
Мы выбралиМодульный монолит:
- Одиночный репоВедет тривиально.
- Функции флаговДавайте отправим темные функции по одному арендатору за раз.
- Переехать в услугиТолько когда модуль перерастает монолитПолем
4 - Frontend Reward: Angular 19 с местным SSR 🖼
# add server-side rendering in two commands
npx ng add @angular/ssr
npm run build:ssr && npm run serve:ssr
Два урока извлечены
- Ленивые острова:Тяжелые графики и диаграммы взорвались
renderApplication
память Мы завернули ихngSkipHydration
и увлажняется наIntersectionObserver
Полем - TC39 Temporal API:Новые даты Angular 19
Результат:LCP <2 S на настоящих устройствах Moto G4Полем
5 - Бэкэнд и аренда: Фастификация + Postgres RLS 🗄
- ФормификацияПотому что 80 К REQ/S на одном M6G большой с нулевой настройкой.
- Безопасность на уровне строк (
policy USING (tenant_id = current_setting('app.tenant_id'))
) держит один дБ, пока мы не достигли 1 ТБ - затем мы разбиваемся. - Наблюдаемость: Opentelemetry → Grafana Cloud; Одна приборная панель на арендатора с шаблоном UID.
6-CI/CD: развертывается только зеленые в 45 линиях 📦
# .github/workflows/deploy.yml (core)
on: [push]
jobs:
test: … # npm ci && npm test
build_ssr: … # npm run build:ssr
deploy:
needs: build_ssr
runs-on: ubuntu-latest
permissions: { id-token: write }
steps:
- uses: hashicorp/setup-terraform@v3
- run: terraform init && terraform apply -auto-approve
Prod разворачивается через 11 минут. Если тесты терпят неудачу, Prod нетронут.
7 - Безопасность сначала (действительно) 🔐
Слой | Необходимо контролировать | Инструмент |
---|---|---|
Аут | Без пароля Magic-Link + OAuth 2.1 | Auth.js& Argon2 |
API | Заражающий ограничение скорости + HMAC SIGS | Фастификация крючков, Redis |
Данные | AES-256 PII шифрование + RLS | Postgres 15, AWS KMS |
Непрерывно | CIS -уровень 1 как код | Tfsec, Открытый политический агент |
Забавный факт:Неделя 1, 37 % трафика были ботами по борьбе с учетом полномочий-автоматически.
8 - Матрица рычага стоимости 💸
Рычаг | Сэкономить год-1 | Как |
---|---|---|
Кеширование края | -23 % | CloudFlare Caches SSR HTML + Stail While-revalidate |
Без сервера Cron | -11 % | Ночные отчеты перешли в AWS Lambda |
Облачные кредиты | -17 % | AWS Activate + Спонсорство с открытым исходным кодом |
Мульти-аз | +6 %расходы | Стоит: SLA 99,95 % → отток -1,2 % |
9-Пять уроков, которые мы продолжаем изучать
- Флаги функций> Живущие ветви.
- Измерить поле LCP, не только маяк.
- Документы или умереть.Каждый интерфейс изменение = один файл ADR.
- Ид арендатора в день 0-Ретро-подход-это ад.
- Спринт после запуска "Broken Windows"спасает моральный дух.
10 - Pocket Checklist (украсть меня) ✅
- ☐ Создайте матрицу связи
- ☐ Добавить
tenant_id
Столбец везде сейчас - ☐ Корабль рискованные кусочки за флагами
- ☐ Синтетическая проверка здоровья на арендатора
- ☐ Запланировать спринт «Исправить разбитые окна» после Go-Live
Доставка SaaS никогда не является магией в один щелчок.Но с модульным планом, безжалостной дисциплиной DevOps и одержимостью пользовательским опытом, вы можете превратить скрипучий монолит в рост маховика менее чем за месяц. Поделитесь своими военными историями ниже - шрамы по обмену. 🚀
Оригинал