Перейти к основному содержимому

Оценка архитектурных альтернатив

Архитектору Разработчику Аналитику

Спор «монолит или микросервисы», «REST или очередь», «PostgreSQL или Cassandra» редко имеет один правильный ответ для всех. Ответ зависит от контекста проекта: нагрузка, число команд, зрелость эксплуатации, регуляторика, сроки. Эта статья — практичный шаблон оценки альтернатив (trade-off analysis) для архитектора и техлида: как сравнивать варианты честно, фиксировать решение и не спорить «на вкус».

Для новичка

Ваша задача — записать, почему в нашем случае вариант A лучше B, и что мы готовы за это заплатить. Один ADR на 15–30 строк часто ценнее десятистраничного документа.

Связь: NFR, ADR в основах, техническое письмо — архитектурное решение, роль архитектора, Event Storming.


Зачем формальная оценка

Без явной оценки команда повторяет одни и те же споры каждый квартал. Новый техлид снова предлагает «разрезать монолит», старый — «вернуть всё в один деплой». Формальная оценка здесь — память и общий язык:

  • все видят одни и те же критерии;
  • веса согласованы с бизнесом («срок важнее идеальной согласованности»);
  • решение можно пересмотреть, когда изменился контекст (новая нагрузка, новая команда).

Тяжёлые методы вроде ATAM (Architecture Tradeoff Analysis Method) существуют для крупных систем; для большинства agile-команд достаточно матрицы на 1–2 страницы + ADR + короткий review.


Термины простым языком

ТерминОбъяснение
Trade-offКомпромисс: усилили одно — ослабили другое (скорость релиза ↔ сложность эксплуатации).
Архитектурно значимое требованиеNFR, от которого меняется выбор структуры (не «цвет кнопки»).
Quality attributeАтрибут качества: производительность, доступность, безопасность и т.д.
Deal-breakerУсловие, при котором вариант отбрасывается без дальнейшего обсуждения.
SpikeКороткий эксперимент (обычно 2–5 дней), чтобы проверить риск до большого проекта.
Fitness functionАвтоматическая проверка в CI (например, запрет импортов между модулями).
Eventual consistencyДанные со временем сходятся между частями системы; мгновенной общей картины нет.

Когда нужна формальная оценка

  • Выбор стиля развёртывания или способа интеграции.
  • Смена брокера, БД, облака, модели согласованности.
  • Спор между командами, который повторяется каждый квартал.
  • Требование аудита или регулятора «обосновать решение».

Когда достаточно короткого обсуждения: переименование пакета, выбор между двумя библиотеками с одинаковым риском (достаточно spike на 1–2 дня и одной строки в ADR).


Шаг 1. Зафиксировать контекст и драйверы

Контекст — одна фраза проблемы, без решения внутри:

«Нужно обрабатывать до 3 000 заказов/мин с p95 ≤ 400 мс и выдерживать падение одной зоны доступности (AZ) без потери принятых заказов».

Плохой контекст: «Нужны микросервисы» — это уже решение, а не проблема.

Архитектурно значимые требования — обычно 3–6 штук, не двадцать. Иначе таблицу заполняют формально и забывают.

АтрибутВопрос, который задаёмПример формулировки
ПроизводительностьКакая нагрузка и задержка?p95 ≤ 400 мс при 3k RPM
ДоступностьКакой простой допустим?99.9%, RTO 15 мин
МасштабируемостьКак растём?Горизонтально без простоя
БезопасностьГде границы доверия?PCI: карты только в Payment context
СопровождаемостьСколько команд?4 команды, независимый релиз раз в 2 недели
СтоимостьБюджет инфры/людей?OpEx облака ≤ X / месяц

Полный каталог атрибутов (ISO/IEC 25010) в жизни сводят к такому короткому списку. Развёрнутый разбор — модель ISO/IEC 25010.

Откуда брать цифры: аналитик и бизнес (SLA), ops (текущие метрики), нагрузочные тесты, прошлые инциденты. Если цифры неизвестны — честно пишем «уточнить до выбора» и закладываем spike на измерение.


Шаг 2. Набросать 2–4 варианта (не больше)

Пример для подсистемы заказов:

  • A. Модульный монолит + read replicas.
  • B. Микросервисы Order / Payment / Inventory, синхронный REST.
  • C. То же, но Order публикует события → Payment и Inventory (async).
  • D. Оставить легаси, Strangler только для витрины.

Правила хороших вариантов:

  • Каждый вариант меняет границы ответственности или способ интеграции, а не только «переезд в Kubernetes».
  • Есть вариант ближе к текущему (baseline), чтобы видеть цену изменения.
  • Варианты реализуемы командой в обозримый срок (или явно помечены как «через 2 года»).

Шаг 3. Матрица trade-off

Оценки: ++ / + / 0 / / −− или баллы 1–5 — главное, одна шкала для всех и пояснение в легенде.

Критерий (вес)A Модульный монолитB MS syncC MS events
Time-to-market (×3)++
p95 latency (×3)+0+
Независимый релиз (×2)++++
Сложность эксплуатации (×2)++−−
Согласованность заказа (×3)+++0
Стоимость (×1)++

Веса ставятся с бизнесом: для стартапа часто ×3 на time-to-market, для банка — на согласованность и аудит.

Как считать (упрощённо): для каждого варианта умножьте оценку на вес и сложите. Итог служит ориентиром для обсуждения; матрица сама по себе не выбирает победителя. Если матрица указывает на «C», а продукт обещает мгновенную оплату — побеждает продукт, и матрицу нужно дополнить критерием UX/согласованности для пользователя.

Разбор

Вариант C выигрывает по независимым релизам, но проигрывает по объяснимости для пользователя (eventual consistency). Если витрина обещает «мгновенную оплату», нужен UX под задержку или синхронный шаг до подтверждения — иначе матрица «красивая», продукт — нет.


Шаг 4. Риски и «что убьёт вариант»

Для каждого варианта запишите deal-breaker — условие отказа:

ВариантПример deal-breakerЧто сделать до выбора
B (MS sync)Нет зрелого tracing → MTTR > 4 ч при инцидентеВнедрить observability, потом резать
C (events)Нет идемпотентных consumer’ов → дубли заказовSpike на повторную доставку сообщений
A (монолит)4 команды ломают друг другу main каждый деньМодульные границы + CI на граф зависимостей

Spike на 3–5 дней дешевле, чем полгода «распределённого монолита» (много сервисов, но одна общая БД и хаотичные вызовы).


Шаг 5. Решение и ADR

Краткий ADR (можно в docs/adr/001-order-architecture.md):

# ADR-001: Архитектура подсистемы заказов

## Статус
Принято (2025-05-20)

## Контекст
3k RPM, 4 команды, легаси-Billing менять нельзя 12 месяцев.

## Рассмотренные варианты
- A модульный монолит
- B микросервисы + sync REST
- C микросервисы + события

## Решение
Модульный монолит Order+Fulfillment; Payment — Strangler через ACL;
события только на границе с Billing.

## Последствия
+ быстрый релиз, одна транзакция для заказа
− Payment остаётся узким местом до миграции
− нужен ADR-002 при выходе Billing из легаси

## Метрики пересмотра
Если p95 > 400 мс при 2k RPM или MTTR > 2 ч — пересмотр варианта C.

ADR читает новый разработчик за 5 минут и понимает ограничения, в которых писать код.


Architecture review (лёгкий формат)

30–45 минут, участники: автор решения, техлиды затронутых команд, по желанию ops/security.

БлокВремяСодержание
Контекст и NFR5 минПроблема и цифры
Варианты и матрица10 мин2–4 варианта, веса
Риски и spike’и10 минDeal-breaker’ы, эксперименты
Решение и действия10 минADR, владельцы, сроки

Ответственность за решение остаётся у назначенного архитектора/техлида; review собирает риски, а не голосование «большинством».

Fitness functions (по желанию): автопроверки в CI — запрет циклических зависимостей между модулями (ArchUnit, Deptrac), линтер на запрещённые импорты между контекстами. Так «договорённость на схеме» не разъезжается через месяц в коде.


Мини-кейс — синхронный REST и очередь

Сценарий: после OrderCreated нужно списать остаток и отправить чек.

Sync RESTAsync event
ПлюсПроще отладка, ошибка сразу в UIСлабая связность, пики сглаживаются
МинусЦепочка отказов, latency суммируетсяЗадержка, дубли, сложнее тесты
Когда уместноМало вызовов, жёсткая согласованность для пользователяВысокий throughput, допустима задержка на экране

Частый компромисс: sync до оплаты (пользователь ждёт результат), async после (email, аналитика, склад в фоне). Это и есть осознанный trade-off, а не «всё в Kafka».


Частые ловушки при оценке

ЛовушкаКак избежать
Сравнение «на бумаге» без spike2–5 дней на самый рискованный вариант
15 критериев без весов3–6 драйверов с весами от бизнеса
Игнор организации1 команда — монолит часто рационален; 4 — нужны границы
Забыть стоимость владенияЛицензии, облако, 24/7 on-call
Нет даты пересмотра ADRУсловие «пересмотреть, если p95 > X»

Дальше


См. также

Другие статьи этого же раздела в боковом меню (как на странице «О разделе»).