ЧистаяВайбАрхитектура (CVA) — Полное руководство
2025-10-16
Оглавление
- Введение и TL;DR
- Глоссарий и терминология
- Архитектурная карта и слои
- Принципы и правила
- Паттерны
- Схема данных и контракты
- Наблюдаемость
- Безопасность
- DevEx и продуктивность
- Референс-скелет (Go)
- Референс-скелет (Symfony/PHP)
- Политики эволюции
- Feature Toggles
- Визуализация
- Чек-листы внедрения
- Лицензирование и вклад
Часть 1: Введение и TL;DR
1.1 Что такое ЧистаяВайбАрхитектура (CVA)
ЧистаяВайбАрхитектура (ClearVibeArchitecture, CVA) — архитектурный стиль для бэкенд-систем, сочетающий:
- Hexagonal (Ports & Adapters) как основу изоляции домена
- Событийность по умолчанию (Domain Events + Outbox/Inbox, идемпотентность)
- Наблюдаемость by default (трассировки, метрики, структурные логи, timeline)
- Обязательные Feature Toggles как сквозной паттерн для любого нового функционала
- Визуализацию потока (web/VR) как продуктовый артефакт, а не «приятную опцию»
Коротко: гексагональная архитектура «с батарейками» — прозрачная, наблюдаемая, управляемо-эволюционная.
1.2 Какую проблему решает
CVA решает следующие ключевые проблемы:
Сложно безопасно менять систему → фичефлаги + canary/blue-green
Не видно, «что происходит внутри» → otel-трейсинг + бизнес-метрики + timeline
Надёжная интеграция между сервисами → Outbox/Inbox + идемпотентность
Разработчики тонут в инфраструктуре → чистый домен и контракты на границах
Сложно объяснить бизнесу поведение системы → визуализатор потока запросов/событий
1.3 Цели (Design Goals)
Архитектура CVA преследует следующие цели:
Прозрачность: любой запрос и событие трассируется сквозь все слои
Изоляция домена: доменная модель независима от инфраструктуры
Надёжная доставка: события публикуются транзакционно (Outbox)
Управляемая эволюция: все новые ветки — за фичефлагами, с версионированием контрактов
Developer Experience: шаблоны модулей, единые практики CI/CD, тесты как стандарт
1.4 Нефункциональные требования (NFR)
- Надёжность: идемпотентные обработчики, ретраи, дедупликация
- Наблюдаемость: p95-латентность, error rate, saturation — обязательные метрики
- Безопасность: Zero-Trust границы; подпись сообщений; аудит изменений флагов/контрактов
- Производительность: in-proc кэш решений флагов, back-pressure, батчинг I/O
- Совместимость: SemVer контрактов API/событий, поддержка n-1
1.5 TL;DR принципов
- Domain First: домен не знает об ORM/HTTP/broker
- Ports & Adapters: весь I/O — через интерфейсы (in/out-порты)
- Events First: доменные события — первоклассные; публикация через Outbox
- Observability First: trace_id везде; бизнес-метрики на доменных событиях
- Feature-Toggles Everywhere: новый функционал не живёт без флага и kill-switch
- Contracts First: схемы API/событий версионированы, проверяемы, совместимы
- Visualize the Flow: обязательная визуализация пути запроса/событий
1.6 Область применения
CVA лучше всего подходит для:
- Микросервисы и крупные монолиты с перспективой декомпозиции
- Высокая интеграционная нагрузка, частые релизы, A/B-эксперименты
- Команды, которым важны прозрачность и воспроизводимость инцидентов
Важно: CVA не лучший выбор, если система крайне проста, почти не меняется и не требует телеметрии/событийности.
1.7 Критерии «готовности по CVA»
Система считается готовой к CVA, если:
Все новые фичи замкнуты на feature flags с canary и kill-switch
Есть Outbox/Inbox и идемпотентные обработчики
Включён OpenTelemetry (трейсинг), структурные логи и ключевые бизнес-метрики
Контракты API/событий описаны схемами, проходят CI-валидацию, ведётся SemVer
Есть веб/VR-визуализатор потока (минимум — веб-граф + timeline)
Шаблоны/генераторы модулей, линтеры, PR-чек-листы, базовые e2e-тесты
1.8 Артефакты на выходе
- Архкарта слоёв и портов (in/out), модель домена и границы контекстов
- Каталог контрактов (OpenAPI/Proto/JSON-Schema/Avro) с SemVer и проверками
- Outbox/Inbox библиотека/модуль, FeatureGate SDK, otel-интеграция
- Дашборды SLO и визуализатор потока (минимально — веб)
- Шаблоны кода (Go, Symfony/PHP), Makefile/Compose, CI-пайплайн
Часть 2: Глоссарий и терминология
2.1 Базовые сущности
Домен (Domain) — предметная область, описывающая бизнес-правила и инварианты
Агрегат (Aggregate) — корневая сущность, инкапсулирующая состояние и поведение связанных объектов
Событие (Domain Event) — неизменяемый факт, зафиксированный в домене
Команда (Command) — намерение изменить состояние (создать, обновить, удалить)
Запрос (Query) — намерение получить данные без побочных эффектов
Use Case (Юзкейс) — прикладная логика, связывающая команду/запрос и домен
2.2 Порты и адаптеры
InPort — интерфейс входа в систему (API, UI, CLI, тест)
OutPort — интерфейс выхода из системы (база данных, брокер сообщений, сторонние API)
Adapter — реализация порта для конкретной инфраструктуры
2.3 Событийные компоненты
Outbox — таблица/хранилище для надёжной публикации событий вместе с транзакцией
Inbox — таблица/хранилище для приёма и дедупликации входящих событий
Saga/Process Manager — координирует длинные процессы через последовательность событий
2.4 Observability
- Trace ID — уникальный идентификатор запроса, прокидывается через все слои
- Span — часть трейса, отражающая шаг (например: SQL-запрос, вызов API)
- Metric — измерение (latency, error rate, business metric)
- Structured Log — лог в формате JSON с обязательными полями (timestamp, trace_id, level, message)
2.5 Feature Toggles
- Feature Flag (Фичефлаг) — бинарный переключатель или вариативный параметр, управляющий доступностью функционала
- Variant — значение вариативного флага (A/B/n-тест)
- Kill-Switch — флаг для мгновенного отключения проблемной функции
- Exposure Event — событие факта показа функционала пользователю
2.6 Контракты
- API Contract — формальное описание API (OpenAPI, gRPC proto)
- Event Contract — описание структуры события (JSON Schema, Avro)
- Backward Compatibility — новое описание не ломает клиентов предыдущих версий
- SemVer — версионирование контрактов по правилам Semantic Versioning
2.7 Политики
- Access Policy — правила авторизации и прав доступа на уровне use case
- Validation Policy — проверка данных до входа в домен
- Rollout Policy — стратегия включения флага (percentage, segment, variant)
2.8 Визуализация
- Timeline — хронологический поток событий/запросов с задержками и статусами
- Flow Graph — граф узлов (сервисы, агрегаты) и рёбер (события, вызовы)
- Heatmap — визуализация узких мест по latency/error rate
2.9 DevEx
- Scaffold — генератор шаблонов модулей и портов
- CI/CD Pipeline — сборка, тестирование и деплой системы
- PR Checklist — набор обязательных пунктов для ревью (фичефлаг, метрики, тесты)
Часть 3: Архитектурная карта и слои
3.1 Общая схема
┌─────────────────────────────────────────────────────┐
│ Interface Layer │
│ (REST, gRPC, GraphQL, CLI, VR/AR) │
└────────────────┬────────────────────────────────────┘
│ InPorts
┌────────────────▼────────────────────────────────────┐
│ Application Layer │
│ (Commands, Queries, Handlers, Policies) │
└────────────────┬────────────────────────────────────┘
│ Domain Services
┌────────────────▼────────────────────────────────────┐
│ Domain Layer │
│ (Entities, Aggregates, Events, Value Objects) │
└─────────────────────────────────────────────────────┘
▲
│ OutPorts
┌────────────────┴────────────────────────────────────┐
│ Infrastructure Layer │
│ (DB, Brokers, Outbox/Inbox, Observability) │
└─────────────────────────────────────────────────────┘
3.2 Interface Layer
Вход: REST, gRPC, GraphQL, CLI, VR/AR-визуализатор
Задачи: принимать команды/запросы, конвертировать в DTO, передавать в Application
Особенности: логирование, трассировка, authN/authZ
3.3 Application Layer
Сердце прикладной логики, включающее:
- Команды, запросы, хендлеры, политики
- Координация: orchestrators, saga, process managers
- Валидация и маппинг DTO
- Гарантия транзакционных границ: один use case = одна транзакция
- Все побочные эффекты — через Outbox
Важно: Application Layer обеспечивает транзакционную целостность всех операций.
3.4 Domain Layer
Чистое доменное ядро системы:
- Entities, Aggregates, Value Objects
- Инварианты, бизнес-правила, ubiquitous language
- Domain Events как первоклассные объекты
- Domain Services — чистые функции без инфраструктуры
Принцип: Domain не знает об ORM, HTTP, брокерах и любой инфраструктуре.
3.5 Infrastructure Layer
- Реализация портов: репозитории, адаптеры брокеров, клиентов внешних API
- Outbox/Inbox — обязательные компоненты для публикации/приёма событий
- Observability stack: otel-интеграция, логирование, метрики
- Кэширование, файловые хранилища, интеграции с внешними сервисами
3.6 Взаимодействие слоёв
- Зависимости всегда направлены внутрь (Infrastructure → Application → Domain)
- Interface вызывает Application через InPorts
- Application использует OutPorts, которые реализуются в Infrastructure
- Domain общается только с Application через события и инварианты
3.7 «Вайб» слоя
У каждого слоя свои обязательные артефакты:
- Interface: трассировки, authN/authZ
- Application: команды, события, фичефлаги
- Domain: инварианты, события
- Infrastructure: outbox/inbox, observability
Всё вместе создаёт живой поток, который можно проследить и визуализировать.
Часть 4: Принципы и правила
4.1 Чистое ядро (Domain First)
Ключевые правила:
- Домен изолирован от инфраструктуры
- Запрещено использовать ORM-аннотации, SQL или SDK внешних сервисов внутри домена
- Инварианты проверяются только в домене
Принцип: Доменный слой должен оставаться чистым и не зависеть от технических деталей реализации.
4.2 Порты и адаптеры
- Все внешние взаимодействия — через интерфейсы (Ports)
- Реализации интерфейсов — только в Infrastructure (Adapters)
- Application вызывает OutPorts, Domain ничего не знает о них
4.3 Событийность по умолчанию
Обязательные требования:
- Каждое значимое изменение фиксируется как Domain Event
- События публикуются через Outbox вместе с транзакцией
- Для входящих событий используется Inbox с идемпотентностью
Важно: Событийность — не опциональная возможность, а обязательный элемент архитектуры CVA.
4.4 Транзакционные границы
- Один use case = одна транзакция
- Побочные эффекты (отправка в брокер, интеграции) фиксируются в Outbox
- Обработка Outbox асинхронна и ретраибельна
4.5 Наблюдаемость по умолчанию
- Каждый запрос и событие сопровождается trace_id
- Все хендлеры и адаптеры обязаны логировать и метриковать свою работу
- Бизнес-события становятся частью метрик (например: order.created.count)
4.6 Договоры на границах
- API и события описываются контрактами (OpenAPI/Proto/Avro/JSON Schema)
- Контракты версионируются (SemVer)
- Backward Compatibility — обязательное требование (поддержка n-1 версий)
4.7 Feature Toggles Everywhere
Обязательные требования:
- Любой новый функционал внедряется только за флагом
- Фичефлаг обязателен, даже если функционал будет всегда включён позже
- У каждого флага есть владелец, sunset-дата и kill-switch
Принцип: Feature flags — это не опция, а обязательный паттерн для любого нового кода в CVA.
4.8 Визуализация потока
- Таймлайн запроса и событий должен быть воспроизводим в визуализаторе (web/VR)
- Узкие места подсвечиваются автоматически (heatmap)
- Визуализация — часть продукта, а не «доп. тул»
4.9 Эволюционность
- Все изменения проходят через feature flags и canary/blue-green
- Миграции БД выполняются с обратимостью
- Shadow-write/read при раскатке новых моделей данных
4.10 Безопасность
- Zero Trust между сервисами: mTLS, подпись сообщений
- RBAC для админки и управления фичефлагами
- Audit trail для всех событий и изменений
4.11 Качество
- Unit и property-based тесты на инварианты
- E2E тесты сквозного сценария (создать → опубликовать событие → обработать)
- Линтеры и статический анализ как часть CI
Часть 5: Паттерны
5.1 Hexagonal / Ports & Adapters
Базовый паттерн CVA:
- Домен изолирован, входные и выходные зависимости оформлены как InPorts/OutPorts
- Взаимодействие с внешним миром происходит через адаптеры
Основа CVA: Hexagonal Architecture обеспечивает изоляцию доменной логики от технических деталей.
5.2 CQRS (опционально)
- Разделение команд (изменения состояния) и запросов (чтение данных)
- Используется там, где чтение сильно отличается от записи
- Позволяет масштабировать чтения и писать оптимизированные проекции
5.3 Outbox / Inbox
Ключевые компоненты событийной архитектуры:
- Outbox: транзакционная запись событий вместе с изменением в БД
- Inbox: регистрация и дедупликация входящих сообщений
Гарантия: Паттерн Outbox/Inbox обеспечивает exactly-once delivery на прикладном уровне.
5.4 Saga / Process Manager
- Управление долгоживущими процессами
- Saga: цепочка шагов с компенсациями
- Process Manager: реагирует на события, координирует действия нескольких агрегатов/сервисов
5.5 Policy / Rule Engine
- Декларативные правила для бизнес-логики (например, скидки, тарифы, доступ)
- Реализуется в Application Layer
- Может подключаться к внешнему движку правил
5.6 Event Sourcing (опционально)
- Хранение истории изменений как последовательности событий
- Позволяет «переиграть» состояние
- Подходит, когда важна аудитируемость и полная история
5.7 Feature Toggles (обязательный)
- Сквозной паттерн: любой новый функционал внедряется за флагом
- Флаги имеют владельца, sunset-даты и kill-switch
- Поддерживается процентный rollout, сегменты пользователей, A/B/n-тесты
- Логируется каждое exposure event (факт использования флага)
5.8 Observability Patterns
- Distributed Tracing: trace_id сквозь все слои
- Structured Logging: JSON-логи с ключевыми полями
- Metrics & SLOs: бизнес и технические метрики; авто-алерты
- Timeline Visualization: поток событий и запросов отображается в веб/VR
5.9 Database Patterns
- Shadow Write/Read: временный дубль данных при миграции схемы
- Blue/Green Schema Migration: параллельное ведение старой и новой версии таблицы
- Transactional Outbox: публикация событий вместе с транзакцией в БД
5.10 Deployment Patterns
- Feature Flags + Canary Release: новый функционал включается постепенно
- Blue/Green Deployment: два параллельных окружения, быстрое переключение
- Rollback по метрикам: автоматическое отключение фичи/версии при деградации
Часть 6: Схема данных и контракты
6.1 Контракты API
Обязательные требования:
- Все публичные API описываются в OpenAPI или gRPC Proto
- Контракты проходят автоматическую проверку в CI
- Версионирование строгое: SemVer (1.2.3)
- Backward compatibility: поддержка n-1 версии клиента
- Контракты публикуются в артефакт-репозиторий
Важно: Контракты — это формальное соглашение между командами и сервисами.
6.2 Контракты событий
- События описываются в JSON Schema, Avro или Protobuf
- Каждое событие имеет: event_name, version, timestamp, trace_id, payload
- Обязательные поля: id, trace_id, source
- События проходят проверку схемы до публикации
6.3 Версионирование
- Контракты версионируются независимо от сервисов
- Поддержка нескольких версий событий: потребители могут читать v1 и v2 параллельно
- При переходе: producer начинает публиковать оба формата (dual write)
6.4 Схемы БД
- Миграции управляются инструментами: Liquibase/Flyway/golang-migrate/DoctrineMigrations
- Каждое изменение в БД сопровождается скриптом миграции
- Поддерживается shadow-write/read при сложных изменениях схемы
- Все миграции проходят через CI и тестовую базу
6.5 Контракты для Feature Flags
- Фичефлаг — тоже контракт
- Поля: key, type, rules, default, owner, ttl, version
- Хранятся в Postgres (истина) + Redis (кэш)
- Версионируются так же, как API и события
6.6 CI-проверки контрактов
- Проверка схем API и событий на валидность
- Проверка совместимости (n-1)
- Автогенерация SDK (Go, PHP, TS)
- Сравнение изменений с предыдущими версиями
6.7 Документация контрактов
- Сервис-каталог: документация доступна в Swagger UI или gRPC UI
- События документируются в Event Catalog
- Все изменения фиксируются changelog’ом
6.8 «Вайб» в контрактах
- Контракты не только для машин — но и для людей
- Каждое событие описывается в терминах бизнеса, а не техники
- Визуализатор использует схемы для отображения структуры данных в потоке
Часть 7: Наблюдаемость
7.1 Принцип «Observability by Default»
Ключевой принцип CVA:
- Любой новый сервис или модуль в CVA обязан иметь встроенные средства наблюдаемости
- Метрики, логи и трассировки не добавляются «потом» — они часть архитектуры
- Наблюдаемость охватывает и технические, и бизнес-процессы
Принцип: Наблюдаемость — не надстройка, а встроенная часть архитектуры с первого дня.
7.2 Трассировки (Distributed Tracing)
Обязательные требования:
- Используется OpenTelemetry или совместимый стандарт
- Каждый запрос имеет уникальный
trace_id - Каждая операция (SQL, RPC, внешнее API) фиксируется как span
- Все события (Domain Events) также несут
trace_id - Визуализатор (web/VR) строит таймлайн на основе
trace_id
Совет: Единый
trace_idпозволяет проследить весь путь запроса через все сервисы и слои.
7.3 Логи (Structured Logging)
Формат логов:
- Формат: JSON
- Обязательные поля:
timestamp,level,trace_id,service,message - Логи пишутся в stdout → централизованное хранилище (ELK, Loki)
- Ошибки и бизнес-события фиксируются одинаково структурировано
Принцип: Структурированные логи позволяют легко фильтровать и анализировать события.
7.4 Метрики
- Технические: latency (p95/p99), error_rate, saturation, throughput
- Бизнес: количество заказов, конверсия, количество отказов по правилам
- Feature Flags: метрики exposure (сколько пользователей видит фичу), enable_rate
- Метрики доступны в Prometheus/Grafana или аналогах
7.5 Алерты и SLO
- Каждая критичная метрика имеет SLO (Service Level Objective)
- Нарушения → алерты (PagerDuty, Slack, Email)
- Алерты должны быть actionable (понятно, что делать при срабатывании)
- Для фичефлагов есть авто-откат по SLO
7.6 Timeline и Flow Visualization
- Timeline: шаги запроса (API → Application → Domain → Outbox → Consumer)
- Flow Graph: узлы = сервисы/агрегаты, рёбра = события/вызовы
- Heatmap: подсветка узких мест по latency/error_rate
- Поддержка VR: разработчик/аналитик может «увидеть» поток данных в 3D
7.7 Наблюдаемость в CI/CD
- Unit-тесты проверяют наличие базовых метрик и логов
- E2E-тесты фиксируют trace_id и проверяют, что он проходит сквозь систему
- В CI проверяется схема логов и наличие trace_id в событиях
7.8 «Вайб» наблюдаемости
- Система «светится изнутри» — любой запрос или событие видны
- Бизнес может видеть живые дашборды
- Разработчики могут отследить ошибку до конкретного шага
- Наблюдаемость — не надстройка, а часть архитектурного стандарта
Часть 8: Безопасность
8.1 Принцип Zero Trust
Ключевые положения:
- Каждый сервис и компонент взаимодействует с другими только через проверенные каналы
- По умолчанию нет доверия даже внутри одной сети
- Авторизация и аутентификация применяются на каждом уровне
Принцип: Zero Trust означает, что доверие нужно заслужить на каждом шаге, а не предоставлять по умолчанию.
8.2 Аутентификация (AuthN)
- Внешние вызовы: OAuth2 / OpenID Connect / mTLS
- Внутренние вызовы: сервисные аккаунты + mTLS
- Все запросы обязаны содержать корреляционный trace_id и токен авторизации
8.3 Авторизация (AuthZ)
- RBAC (Role-Based Access Control) или ABAC (Attribute-Based Access Control)
- Проверки прав выполняются в Application Layer (policies)
- Feature Flags могут ограничиваться по ролям/сегментам
8.4 Шифрование
- В транзите: TLS 1.3 (API, брокеры, БД)
- В покое: шифрование дисков/таблиц/объектов (AES-256)
- Конфиденциальные данные (PII) — всегда зашифрованы
8.5 Управление секретами
- Секреты не хранятся в коде или переменных окружения
- Используется Vault/KMS (HashiCorp Vault, AWS KMS, GCP Secret Manager)
- Доступ к секретам — строго по принципу минимальных прав
8.6 Аудит и логирование
- Все действия фиксируются в audit log
- Audit log immutable, хранится отдельно
- Для критичных операций фиксируются IP, userId, trace_id, действие, результат
8.7 Feature Flags и безопасность
- Каждый флаг имеет владельца и sunset-дату
- Изменение флагов возможно только с авторизацией
- Все изменения логируются в audit trail
- Kill-switch можно дернуть только авторизованной ролью
8.8 Политики безопасности
- Least Privilege: сервисы и пользователи имеют только минимально необходимые права
- Defense in Depth: защита на каждом уровне (API, App, DB, Infra)
- Fail Secure: при ошибке доступ запрещён, а не открыт
8.9 Соответствие (Compliance)
- CVA ориентируется на стандарты: GDPR, HIPAA, PCI DSS
- Логи и метрики должны учитывать защиту персональных данных
- PII в событиях хэшируется/псевдонимизируется
8.10 «Вайб» безопасности
- Безопасность встроена «по умолчанию», а не как «опция»
- DevOps/разработчик не тратит время на изобретение решений
- Бизнес видит прозрачность: кто, когда и почему сделал изменение
Часть 9: DevEx и продуктивность
9.1 Принцип DevEx-first
Философия CVA:
- Архитектура должна быть удобной для разработчика
- Шаблоны, инструменты и процессы встроены в CVA
- Разработчик тратит минимум времени на рутину и инфраструктуру
Совет: Хороший DevEx повышает скорость разработки и снижает вероятность ошибок.
9.2 Scaffold и генераторы
Автоматизация создания кода:
Генераторы кода для сущностей, команд, событий, портов и адаптеров.
Пример использования:
| |
Создаётся структура:
- Domain: entity, events, value objects
- Application: commands, handlers, policies
- Infrastructure: repository, adapters
Совет: Генераторы обеспечивают единообразие структуры во всех модулях проекта.
9.3 Кодстайл и линтеры
- Единый кодстайл (Go, PHP, JS/TS)
- Pre-commit hooks: линтеры, тесты, security scans
- Обязательная проверка trace_id, логов, фичефлагов
9.4 CI/CD пайплайн
CI проверяет:
- Компиляцию/сборку
- Тесты (unit, integration, e2e)
- Схемы контрактов (API, события)
- Миграции БД
- Security scan
CD поддерживает:
- Blue/green deployment
- Canary deployment
Важно: Автоматизация CI/CD — обязательное требование для безопасной эволюции системы.
9.5 Тестирование
- Unit: инварианты домена
- Property-based: проверка правил и моделей
- Integration: взаимодействие с адаптерами (DB, broker)
- E2E: полный сценарий (запрос → событие → consumer → проекция)
- Smoke-тесты для rollout под feature flags
9.6 Productivity Tools
- Makefile/Taskfile для стандартных задач (build, test, run, migrate)
- Docker Compose/Dev Containers для локальной разработки
- Автогенерация документации (Swagger, AsyncAPI)
- Hot reload / watch mode для dev-окружения
9.7 PR Checklist
Обязательные пункты для каждого PR:
- Есть feature flag
- Добавлены метрики и
trace_id - Контракт обновлён и проверен
- Миграции БД задокументированы
- Тесты: unit + integration + e2e
- Логи структурированы
Важно: Чек-лист обеспечивает качество каждого изменения и соответствие стандартам CVA.
9.8 Обратная связь
- DevEx метрики: время на ревью, время на деплой, MTTR
- Система должна быть «приятной» для работы
- Любое улучшение, которое повышает скорость и снижает стресс разработчиков — часть CVA
9.9 «Вайб» DevEx
- Разработчик чувствует поток: scaffold → код → тесты → визуализация
- Инструменты не мешают, а помогают
- «Сначала скучно, потом приятно» → стандарты дают предсказуемость и уверенность
Часть 10: Референс-скелет (Go)
10.1 Общая структура проекта
/clearvibe
/cmd
/app
main.go // точка входа
/internal
/domain
/order
entity.go // Aggregate, инварианты
events.go // Domain Events
service.go // Domain Services
/app
/order
commands.go // команды: CreateOrder, PayOrder
handler.go // CommandHandlers
policies.go // правила доступа и валидации
ports.go // InPorts, OutPorts (Repo, Broker, Flags)
/infra
/db
order_repo_pg.go // реализация OrderRepo через Postgres
/broker
outbox.go // Outbox publisher
inbox.go // Inbox consumer (идемпотентность)
/http
server.go // HTTP API → InPorts
/obs
tracing.go // OpenTelemetry
metrics.go // Prometheus
logging.go // slog / structured logging
/flags
feature_gate.go // SDK фичефлагов
10.2 Интерфейсы портов
| |
10.3 Команда и хендлер
| |
10.4 Реализация репозитория
| |
10.5 Outbox Publisher
| |
10.6 Feature Flags SDK
| |
10.7 Observability интеграция
tracing.go: инициализация OpenTelemetry, экспорт трейсовmetrics.go: регистрация бизнес-метрик (order_created_total)logging.go: slog с JSON-форматом и trace_id
10.8 «Вайб» Go-скелета
- Чёткое разделение слоёв
- Feature flags встроены сквозь Application
- Outbox обеспечивает надёжную доставку событий
- Observability встроена в каждый слой
- Код легко тестируется (моки портов)
Часть 11: Референс-скелет (Symfony/PHP)
11.1 Общая структура проекта
src/
Domain/Order/
Entity/Order.php
Event/OrderCreated.php
ValueObject/Item.php
Service/PricingService.php
Repository/OrderRepositoryInterface.php
Application/Order/
Command/CreateOrder.php
Handler/CreateOrderHandler.php
Policy/OrderPolicy.php
Port/In/CreateOrderHandlerInterface.php
Port/Out/OrderRepository.php
Port/Out/OutboxBus.php
Port/Out/FeatureGate.php
Infrastructure/
Persistence/Doctrine/OrderRepository.php
Messaging/OutboxPublisher.php
FeatureFlags/RedisFeatureGate.php
Http/Controller/OrderController.php
Observability/TracingMiddleware.php
Observability/Logger.php
Observability/Metrics.php
11.2 Сущность и событие
| |
11.3 Команда и обработчик
| |
11.4 Репозиторий
| |
11.5 Outbox Publisher
| |
11.6 Feature Flags
| |
11.7 Контроллер
| |
11.8 Observability
- TracingMiddleware: добавляет trace_id в каждый запрос и передаёт его в шину сообщений
- Logger: структурированный JSON-лог через Monolog
- Metrics: счётчики (order_created_total), latency, error_rate
11.9 «Вайб» Symfony-скелета
- DDD-структура: Domain/Application/Infrastructure
- Feature flags интегрированы прямо в Handler
- Outbox обеспечивает надёжность доставки событий
- Observability встроена в middleware, логику и метрики
- Код легко тестируется и масштабируется
Часть 12: Политики эволюции
12.1 Общий принцип
Ключевой принцип эволюции:
Эволюция — управляемая и наблюдаемая.
Любое изменение:
- Проходит через фичефлаги, контракты и миграции
- Имеет владельца и риск-план
- Имеет пути отката
Принцип: Безопасная эволюция требует планирования и возможности отката на каждом этапе.
12.2 Версионирование контрактов (API/Events)
- SemVer: MAJOR.MINOR.PATCH
- Совместимость n-1: минимум одна предыдущая версия поддерживается
- Dual write/read: при миграции событий производитель публикует vN и vN+1
- CI-валидаторы совместимости: запрещают breaking-changes без MAJOR
12.3 Жизненный цикл фичи (Feature Lifecycle)
Этапы жизненного цикла:
Draft: флаг создан (disabled), владелец, цель, метрики успеха, sunset-дата
Internal: включено для dev/stage/own team
Canary: 1% → 5% → 25% → 50% → 100% (детерминированный бакетинг)
General Availability: флаг по умолчанию on
Sunset: флаг и мёртвый код удалены, контракты стабилизированы
Совет: Постепенный rollout позволяет выявить проблемы на ранних этапах.
12.4 Стратегии релиза
- Blue/Green: два окружения, переключение трафика
- Canary: инкрементальный rollout с авто-стражами по SLO
- Dark Launch: код задеплоен, фича выключена флагом до активации
12.5 Откат (Rollback) и Kill-Switch
- Kill-Switch: мгновенно отключает фичу на всём трафике
- Auto-rollback: триггер по SLO (error_rate/latency/conversion)
- Чек-лист отката: кто дергает, что откатываем, как верифицируем
12.6 Эволюция данных и схем
- Миграции с обратимостью: up/down
- Shadow Write/Read: временно пишем в новую схему, читаем из старой
- Backfill/Replay: безопасная догрузка исторических данных
- Контроль последовательности: миграции данных не идут вперёд без зелёных метрик
12.7 Политики изменения домена
- Изменение инвариантов — только через фичефлаг и миграции
- Новые атрибуты — совместимые (nullable/optional) до полного включения
- Удаление полей — после sunset и MAJOR
12.8 Governance изменений
- RFC/ADR: каждое значимое изменение оформляется решением
- Owner & DRI: владелец, сроки, метрики успеха, риск-план
- Gate в PR: наличие флага, метрик, миграций, тестов — обязательно
12.9 Наблюдаемость эволюции
- Метрики миграций: скорость backfill, доля трафика на новой ветке
- События эволюции: flag.exposed, flag.variant, migration.started/completed
- Дашборды перехода: сравнение p95/error_rate/бизнес-метрик по старой/новой ветке
12.10 Безопасность и соответствие
- Изменение флагов/контрактов — только с RBAC и аудитом
- PII-безопасность при миграциях (псевдонимизация/шифрование)
- Хранение ADR/RFC и журналов аудита — неизменяемое
Часть 13: Feature Toggles
13.1 Принцип
Feature Toggles — обязательный и сквозной паттерн CVA.
Любой новый функционал внедряется только за флагом:
- Флаг есть всегда
- У каждого флага есть владелец, версия, sunset-дата и kill-switch
- Решения по флагу наблюдаемы и логируются
Принцип: Feature flags — не опциональный инструмент, а обязательный механизм управления изменениями.
13.2 Типы флагов
Основные типы feature flags:
- Boolean: включен/выключен
- Percentage: процент трафика (canary rollout)
- Segment: включение по атрибутам (страна, тариф, роль)
- Multivariant: несколько вариантов для A/B/n-тестов
Совет: Выбирайте тип флага в зависимости от стратегии раскатки функционала.
13.3 Архитектура слоя фичефлагов
Interface/UI ─┐ reads → FeatureGate SDK (in-proc cache) ─┐
API/gRPC ─────┤ │
Application ──┤ policies/deciders → uses FeatureGate ────┼→ Telemetry
Domain ───────┘ │
Infrastructure: Provider (PG/Redis), Syncers, Warmers, Auditor ─┘
13.4 Контракты и хранение
- Хранилище: Postgres (источник истины) + Redis (кэш, pub/sub)
- Схема: flags(id, key, type, rules, default, owner, version, ttl, updated_at)
- Правила: JSON Schema для сегментов/процентов/вариантов
- Версионирование: SemVer для контрактов флагов, поддержка n-1
13.5 SDK API (Go)
| |
Использование:
| |
13.6 SDK API (Symfony/PHP)
| |
13.7 Метрики и наблюдаемость
- Exposure events: flag.exposed, flag.variant
- Метрики: exposure_count, enable_rate, error_rate, stale_cache_count
- Дашборды: сравнение вариантов (A/B), корреляция с бизнес-метриками
- Trace_id: всегда прокидывается в события экспозиции
13.8 Rollout & Sunset процесс
- Флаг создаётся с default=off
- Включается для команды (internal)
- Canary rollout: 1% → 5% → 25% → 50% → 100%
- General Availability: включен для всех
- Sunset: мёртвый код и сам флаг удалены
13.9 Безопасность
- Управление флагами доступно только авторизованным ролям (RBAC)
- Все изменения фиксируются в audit log
- PII-атрибуты для сегментации хэшируются
- Подпись снапшотов правил для защиты от подмены
13.10 Чек-лист для PR
- Добавлен флаг (с ключом, владельцем, sunset)
- Есть kill-switch
- Метрики и события exposure подключены
- Есть тесты (unit + e2e)
- Флаг документирован
13.11 «Вайб» фичефлагов
- Безопасные изменения без страха
- Возможность быстро экспериментировать (A/B)
- Прозрачность: все знают, какие фичи включены
- Визуализация: на таймлайне видно, где запрос свернул по фичефлагу
Часть 14: Визуализация
14.1 Принцип
Ключевое положение CVA:
В CVA визуализация — это не «приятная опция», а обязательный слой.
Система должна уметь показать поток данных и событий.
Важно: Визуализация делает систему понятной не только для разработчиков, но и для бизнеса.
14.2 Timeline
Хронологическое отображение запроса:
- Отображает шаги запроса в хронологическом порядке
- Примеры шагов: HTTP-запрос принят, Handler выполнен, Событие записано в Outbox
- Каждому шагу соответствует span (trace)
- Timeline доступен в web-интерфейсе и экспортируется в VR
Совет: Timeline помогает визуально увидеть узкие места и последовательность операций.
14.3 Flow Graph
- Узлы: сервисы, агрегаты, адаптеры
- Рёбра: вызовы и события
- Поддержка фильтров: по trace_id, по типу событий, по ошибкам/latency
- Можно проследить путь любого запроса
14.4 Heatmap
- Подсветка узких мест
- Метрики latency/error_rate визуализируются в цвете
- Красный = проблема, зелёный = норма
- Используется для анализа производительности и деградаций
14.5 VR-визуализация
- Поток данных можно «увидеть» в 3D (VR/AR)
- Узлы-сервисы в пространстве, линии-события движутся в реальном времени
- Полезно для обучения новых членов команды и анализа инцидентов
- Интерактивное включение/выключение фичефлагов в VR
14.6 Интеграция с Observability
- Визуализация строится на основе данных OpenTelemetry
- Метрики Prometheus/Grafana агрегируются и отображаются в графах
- Exposure событий фичефлагов отображаются как точки ветвления
14.7 Сценарии использования
- Dev: отладка бизнес-логики → видно, как событие «идёт» по сервисам
- Ops: поиск bottleneck при инцидентах
- Biz: наглядная демонстрация работы продукта
14.8 «Вайб» визуализации
- Система становится «живой» и «светящейся»
- Любой член команды может увидеть поведение, а не только читать логи
- Визуализация формирует доверие между разработкой и бизнесом
Часть 15: Чек-листы внедрения
15.1 Общий чек-лист проекта
- Определены Bounded Contexts и Ubiquitous Language
- Сформирована архитектурная карта слоёв
- Назначен владелец архитектуры (Architecture Owner / Tech Lead)
15.2 Domain Layer
- Все сущности описаны как Entity/ValueObject
- Инварианты зафиксированы и покрыты тестами
- Domain Events определены и документированы
- Нет зависимостей на ORM/HTTP/брокеры
15.3 Application Layer
- Каждое действие оформлено как Command/Query
- Для каждой команды есть Handler
- Политики (Policy) валидируют доступ и правила
- Транзакционные границы определены
- Feature Flags встроены в use cases
15.4 Infrastructure Layer
- Реализованы репозитории через OutPorts
- Подключен Outbox (обязательный)
- Подключен Inbox для входящих событий
- Настроены адаптеры для API/брокеров/БД
- Подключены observability-компоненты
15.5 Interface Layer
- API оформлено в OpenAPI/gRPC
- Добавлен middleware для trace_id и логирования
- Авторизация/аутентификация включены
- Контракты проверяются в CI
15.6 Feature Toggles
- У каждого нового кода есть фичефлаг
- Флаги имеют владельца, sunset-даты, kill-switch
- Exposure событий логируются
- Rollout сценарии задокументированы
- Тесты включают on/off сценарии
15.7 Observability
- Все запросы/события имеют trace_id
- Логи структурированы (JSON)
- Метрики: технические + бизнес
- Дашборды и алерты настроены
- Визуализатор подключен (timeline/flow graph/VR)
15.8 Data & Contracts
- API и события имеют схемы
- Контракты версионированы (SemVer)
- Проверка backward-compatibility в CI
- Миграции БД описаны и протестированы
- Shadow-write/read используется при сложных изменениях
15.9 Security
- Все вызовы аутентифицированы
- RBAC/ABAC политики определены
- Секреты в Vault/KMS
- Audit log immutable и централизован
- PII обрабатываются безопасно
15.10 Delivery & Deployment
- CI: сборка, тесты, линтеры, security scan
- CD: canary/blue-green deployment
- Rollback план задокументирован
- Auto-rollback по SLO включён
- Canary метрики мониторятся
15.11 People & Process
- PR checklist в каждом репозитории
- ADR для значимых изменений
- Регулярный архитектурный review
- Метрики DevEx измеряются
- Обучение команды по CVA
15.12 «Вайб» чек-листов
- Чек-листы делают внедрение архитектуры предсказуемым
- Разработчики уверены, что ничего не упустили
- Бизнес получает стабильную эволюцию без сюрпризов
Часть 16: Лицензирование и вклад
16.1 Лицензия
- Open Source (MIT/Apache 2.0): архитектурные принципы, чек-листы и шаблоны доступны свободно
- Можно использовать в коммерческих и некоммерческих проектах без ограничений
- Единственное требование — сохранять упоминание авторства и лицензии
16.2 Contribution Guide
Pull Request принимается только если:
- Прописан ADR для изменений
- Пройден CI (контракты, тесты, миграции)
- Обновлены чек-листы и документация
- Добавлены примеры (Go/PHP SDK, миграции, метрики)
16.3 Governance
- Maintainers: ответственны за review и выпуск новых версий CVA-манифеста
- Contributors: вносят идеи, багфиксы, дополнения к чек-листам и паттернам
- Решения принимаются через RFC/ADR
16.4 Версионирование манифеста
- Манифест CVA также следует SemVer
- MINOR — добавление паттернов/чек-листов
- MAJOR — изменения в обязательных принципах
16.5 Community
- Slack/Discord/Matrix-группа для обсуждений
- Wiki с best practices и шаблонами
- Showcase: список компаний/проектов, внедривших CVA
16.6 «Вайб» вклада
- CVA — это живая архитектура, которая развивается вместе с сообществом
- Вклад — не только код, но и: документация, схемы, визуализации, примеры
- Каждый коммит делает систему прозрачнее, надёжнее и «вайбовее»
Ключевые отличия CVA
От классической Hexagonal/Clean Architecture
База та же (DDD + Hexagonal), но CVA делает обязательными вещи, которые обычно «допиливают потом»:
- Событийность (Domain Events + Outbox/Inbox)
- Наблюдаемость (трейсинг/метрики/структурные логи)
- Фичефлаги со сквозной интеграцией
- Управляемая эволюция (canary/blue-green, контрактное версионирование)
- Визуализация потока (веб/VR)
Идея: система изначально «живая, прозрачная и безопасно эволюционирующая».
Где CVA лучше
- Прозрачность и отладка — встроенный OpenTelemetry, бизнес-метрики, timeline
- Надёжная интеграция — Outbox/Inbox, идемпотентность, ретраи по умолчанию
- Безопасные релизы — feature flags, canary rollout, kill-switch, авто-откат
- Управляемая эволюция — SemVer, dual write/read, shadow write/read
- Developer Experience — шаблоны, чек-листы, стандарты
- Понимание для бизнеса — визуализация потока, бизнес-метрики из коробки
- Безопасность по умолчанию — RBAC, аудит, zero-trust
Где классический Hexagonal проще
- Маленькие проекты и редкие релизы
- Команда без опыта событийности и телеметрии
- Жёсткие ограничения по инфраструктуре
Когда выбирать CVA
- Микросервисы и интеграционно насыщенные системы
- Частые релизы и эксперименты (growth/продуктовые команды)
- Высокие требования к надёжности доставки событий
- Нужно «прозрачно» объяснять технологию бизнесу
- Планируется масштабирование команды и проекта
Когда лучше остаться на классическом Hexagonal
- Простой сервис/монолит без активной эволюции
- Команда маленькая, нет ресурсов на телеметрию и фичефлаги
- Внешних интеграций почти нет, SLA мягкие
Заключение
ЧистаяВайбАрхитектура — это не просто набор паттернов, а целостный подход к построению современных бэкенд-систем.
CVA делает систему:
Прозрачной — каждый запрос видим от начала до конца
Надёжной — события доставляются гарантированно
Безопасной — изменения контролируемы и откатываемы
Понятной — визуализация помогает всем: от разработчиков до бизнеса
Резюме: Это «Hexagonal на стероидах» — дороже на старте, но многократно окупается на средних и больших системах.