Современные приложения часто требуют гибкости, масштабируемости и быстрой адаптации к изменениям. Традиционные монолитные системы могут не справляться с этими задачами, поэтому всё чаще приложения собирают из независимых и слабосвязанных компонентов.

Композитная архитектура — это подход к проектированию ПО, при котором приложение строится из набора слабосвязанных, независимо разрабатываемых, развёртываемых и масштабируемых компонентов. Эти компоненты взаимодействуют только через чётко определённые интерфейсы (чаще всего API).

В отличие от монолита, где все компоненты тесно связаны, композитный подход позволяет собирать систему как конструктор, комбинируя готовые блоки в разных конфигурациях без необходимости переписывать всю кодовую базу.

Различия между композитными и монолитными архитектурами
Различия между композитными и монолитными архитектурами

Композитная и микросервисная архитектура

Важно понимать, что микросервисная архитектура — это лишь один из возможных стилей в рамках более широкой концепции композитной архитектуры. Ключевой принцип композитной архитектуры — независимое развёртывание модулей, а не их обязательно малый размер.

В композитную архитектуру также входят:

  • Крупные сервисы (макросервисы) — более крупные, чем микросервисы, но автономные компоненты.

  • Packaged Business Capabilities (PBC) — готовые решения, которые объединяют несколько связанных бизнес-возможностей (часто включая в себя несколько сервисов и интерфейсов) в единый, легко интегрируемый модуль.

  • Serverless-функции — идеальны для эпизодических задач (генерации отчётов, обработки файлов) или создания легковесных API.

Ключевое отличие микросервисной архитектуры от других стилей в рамках композитного подхода — степень детализации (гранулярность) и автономии компонентов. В микросервисах делают акцент на высокой гранулярности, когда каждый сервис отвечает за одну чётко определённую бизнес-способность.

Таким образом, композитная архитектура охватывает сборку системы из слабосвязанных, независимо развёртываемых модулей любого типа: отдельный микросервис, PBC или serverless-функцию.

Техническая реализация композитной архитектуры

Каждый компонент управляет своей частью бизнес-логики, имеет независимую кодовую базу и жизненный цикл. Взаимодействие компонентов происходит через API и механизмы обмена событиями, формируя коммуникационную инфраструктуру. Для прямых запросов и ответов используют синхронные протоколы (REST, gRPC, GraphQL). Когда нужна гибкость и устойчивость, прибегают к асинхронной связи через брокеры сообщений (Kafka, RabbitMQ).

API-шлюзы выполняют критически важные функции: 

  • направляют входящие запросы к соответствующим сервисам;

  • обеспечивают безопасность (контроль доступа, аутентификация, TLS-шифрование);

  • преобразуют и объединяют данные из нескольких источников;

  • ограничивают частоту запросов (rate limiting);

  • кешируют ответы и предоставляют метрики для анализа работы системы.

Headless-подход строго разделяет backend (бизнес-логику, данные и API) и frontend (любой пользовательский интерфейс). Это позволяет независимо развивать интерфейсы и бэкенд, используя универсальные форматы данных (JSON, Protobuf) для совместимости. Один бэкенд обслуживает разные клиенты: веб, мобильные приложения, IoT.

Схема взаимодействия через API в композитной архитектуре
Схема взаимодействия через API в композитной архитектуре

Событийно-ориентированная архитектура (EDA) увеличивает гибкость и слабую связанность системы. Сервисы создают события, например, «Пользователь зарегистрирован», и отправляют их в центральный брокер (Kafka, RabbitMQ). Другие сервисы, которые подписаны на эти события, получают их и выполняют свои задачи, например, отправляют приветственное письмо.

Основные принципы композитной архитектуры

1. Модульность (независимость компонентов). Каждый компонент системы:

  • имеет отдельную кодовую базу;

  • разрабатывается, тестируется, развёртывается и масштабируется независимо от других;

  • может использовать оптимальные для своей задачи технологии (языки программирования, базы данных, фреймворки). Однако избыточная полиглотность (множество разных технологий без необходимости) может усложнить поддержку и интеграцию, особенно для PBC или макросервисов.

2. Слабая связанность. Компоненты взаимодействуют только через чётко определённые интерфейсы (API или события), без прямых зависимостей. Для этого используются:

  • синхронные запросы (REST, gRPC, GraphQL);

  • асинхронные события (Kafka, RabbitMQ);

  • унифицированные форматы данных (JSON, Protocol Buffers).

3. Сервис-ориентированность. Каждый компонент инкапсулирует и предоставляет через API законченную бизнес-функцию (например, обработку платежей или управление пользователями). Для успешной работы компонента необходимы:

  • подробная и актуальная документация его API;

  • механизмы автоматического обнаружения (Service Discovery) и стандартизированного взаимодействия (часто через Service Mesh);

  • чёткие метаданные, описывающие его функциональность и требования к интеграции.

Правильная изоляция позволяет обновлять компонент без перетестирования всей системы и локализует сбой, предотвращая полный отказ.

Компоненты композитной архитектуры
Компоненты композитной архитектуры

Преимущества композитной архитектуры

Бизнес получает гибкость: можно тестировать новые функции и процессы с минимальными рисками для всей системы. Новые функции добавляются без переписывания всего приложения. Например, чтобы внедрить чат-бот в интернет-магазин, можно создать отдельный сервис и подключить его через API.

Компоненты, разработанные с учётом повторного использования и чётких контрактов, можно применять в разных проектах. Например, универсальный сервис аутентификации можно подключить к другим проектам компании с минимальными изменениями.

Отпадает необходимость каждый раз создавать с нуля однотипные функции (платежи, уведомления, аналитику). Компания формирует библиотеку готовых решений, ускоряя разработку, новых продуктов.

С технической точки зрения разработчики получают возможность выбирать оптимальные инструменты для решения конкретных задач. Для разных компонентов системы могут быть использованы различные языки программирования, фреймворки, базы данных и т. д. Это позволяет распределить работу между автономными командами, ускорить разработку и чётко распределить ответственность.

С экономической точки зрения такой подход позволяет оптимизировать бюджет. Гранулярное масштабирование позволяет точно выделять ресурсы нуждающимся компонентам, избегая избыточных затрат.

Недостатки композитной архитектуры 

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

  • модули слишком мелкие (например, разбиение на десятки сервисов для простой функциональности);

  • границы между компонентами размыты (сервисы постоянно обращаются друг к другу, создавая запутанные зависимости);

  • нет чёткой доменной модели (сервисы дублируют логику или данные).

Сложность эксплуатации. Распределённая система требует дополнительных инструментов и опыта:

  • платформы для оркестрации нужны для управления множеством независимых сервисов;

  • мониторинг и журналирование — диагностические данные распределены между сервисами, что требует внедрения комплексных решений для их сбора и анализа;

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

Повышенные требования к безопасности. В распределённой системе растёт количество уязвимых мест, ведь каждый API может стать точкой входа для атаки. Основные проблемы:

  • Больше поверхностей атаки: злоумышленник может попытаться взломать не только внешний API, но и внутренние сервисы.

  • Нужно контролировать права для сотен микросервисов.

  • Согласованность политик: если в одном сервисе включено шифрование, а в другом нет — это создаёт риски.

Нужен комплексный подход: Service Mesh-и для управления безопасностью на уровне сети, API-шлюзы для защиты периметра и централизованные системы управления идентификацией и доступом (IAM).

Когда выбирать композитную архитектуру

  • Для крупных, долгоживущих систем (SaaS, корпоративных платформ).

  • Когда нужно быстро адаптироваться к меняющимся требованиям и часто обновлять функциональность.

  • Для интеграции с внешними сервисами (платежами, аналитикой).

  • Если команды распределены географически или работают автономно, чтобы минимизировать зависимости и сократить издержки на координацию. 

Заключение

Выбор между монолитной и композитной архитектурой зависит от требований, размера команды, бюджета и долгосрочных целей проекта. Композитная даёт гибкость, масштабируемость и скорость для сложных систем и команд, но требует зрелых процессов и мощной DevOps-культуры. Монолит проще на старте для небольших проектов, но может стать тормозом при росте и необходимости изменений. Решение зависит от масштаба, сроков, команды и долгосрочных целей проекта.

Комментарии (2)


  1. Dhwtj
    05.08.2025 17:38

    Подход является разновидностью / настройками микросервисов и не выходит за их рамки


  1. SolidSnack
    05.08.2025 17:38

    В отличие от монолита, где все компоненты тесно связаны

    Да хоспаде, если хорошо спроектировать систему то нету такой проблемы, проблема связанности компонентов давно обсуждается. Ну и микросервис это не решение, а те же проблемы только в профиль