Архитектуры приложений: монолитная, сервис-ориентированная и микросервисная

Ключевые тезисы

  • Монолитная архитектура — всё в одном блоке: проще в разработке и деплое, но сложнее в поддержке и масштабировании.
  • Сервис-ориентированная архитектура (SOA) — система из независимых, переиспользуемых сервисов, общающихся через шину данных.
  • Микросервисная архитектура — эволюция SOA: небольшие независимые сервисы, часто со своими БД, общающиеся напрямую или через API-шлюз.
  • Выбор архитектуры определяется на этапе проектирования исходя из требований проекта, бюджета и планов на масштабирование.

Монолитная архитектура

Монолитная архитектура — это подход, при котором все компоненты системы (frontend, backend, бизнес-логика) объединены в единую кодовую базу и единый блок развёртывания.

Виды монолитов:

  • Классический: Frontend и backend не разделены.
  • Современный: Frontend (веб-приложение, мобильное приложение) отделён и взаимодействует с монолитным backend через API.

Преимущества:

  • Простота реализации и деплоя (одно приложение).
  • Упрощённое сквозное тестирование.
  • Высокая производительность (все вызовы внутри одного процесса).

Недостатки:

  • Большая, сложная кодовая база.
  • Риск появления ошибок в несвязанных частях при изменении кода.
  • Сложность масштабирования.

Роль аналитика:

  • В классическом монолите — описание поведения экранов.
  • В современном — дополнительно описание API-вызовов и разделение задач на frontend и backend.

Клиент-серверная архитектура

Способ организации ПО, при котором система делится на две части:

  • Клиент — запрашивает данные (веб-приложение, мобильное приложение).
  • Сервер — формирует и отправляет ответ.

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

Сервис-ориентированная архитектура (SOA)

Подход, при котором приложение разбивается на независимые сервисы, которые можно повторно использовать в разных проектах.

Ключевые характеристики:

  • Автономность: Каждый сервис работает независимо.
  • Переиспользуемость: Сервисы имеют достаточную функциональность для использования в разных бизнес-процессах.
  • Стандартизированные контракты: Чётко определённые интерфейсы взаимодействия.
  • Интероперабельность: Возможность взаимодействия сервисов, написанных на разных технологиях.

Центральный элемент — шина данных (Enterprise Service Bus, ESB):

  • Служит единой точкой входа для маршрутизации запросов.
  • Агрегирует и трансформирует данные (например, из JSON в XML).
  • Управляет бизнес-процессами (оркестрация).
  • Недостатки ESB: Может стать "бутылочным горлышком" и точкой отказа; часто проприетарные решения, требующие специфических знаний.

Преимущества SOA:

  • Независимая разработка и развёртывание сервисов разными командами.
  • Повторное использование функциональности.
  • Упрощение интеграции новых приложений (через шину данных).

Недостатки SOA:

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

Роль аналитика: Детальное описание межсервисных взаимодействий, трансформации данных, определение, в какой сервис добавлять новую функциональность, анализ последствий недоступности сервисов.

Микросервисная архитектура

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

Основные шаблоны (паттерны):

  • API-шлюз: Единая точка входа для клиентов. Занимается маршрутизацией, проверкой запросов, кэшированием.
  • Хореография: Сервисы общаются асинхронно через брокер сообщений (например, Kafka, RabbitMQ). Сервис публикует событие, а другие сервисы, подписанные на него, реагируют.
  • Оркестрация: Выделенный сервис-оркестратор управляет бизнес-процессом, явно вызывая другие сервисы.
  • Backend for Frontend (BFF): Создание отдельного backend-сервиса под конкретный тип клиента (например, под мобильное приложение) для оптимизации данных и форматов ответа.
  • Реестр сервисов: Сервис, который отслеживает состояние, доступность и расположение всех микросервисов.

Преимущества:

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

Недостатки:

  • Сложность деплоя и оркестрации множества сервисов.
  • Сложность сквозного тестирования.
  • Потенциальное дублирование данных в разных хранилищах.
  • Проблемы безопасности и производительности из-за большого количества сетевых вызовов.

Сравнение SOA и микросервисной архитектуры

Критерий Сервис-ориентированная (SOA) Микросервисная
Фокус Переиспользование сервисов Независимая разработка и развёртывание
Область Предприятие (крупные сервисы) Приложение (мелкие сервисы)
Управление Централизованное (шина данных) Децентрализованное (или оркестратор)
Хранение данных Часто единое хранилище Своя БД у каждого сервиса
Коммуникация "Тяжёлые" протоколы (SOAP) "Лёгкие" протоколы (REST, gRPC)

Выбор архитектуры

  • Монолит: Небольшие проекты без планов масштабирования, нуждающиеся в быстром запуске. Иногда используется принцип Monolith First для старта MVP с последующим переходом на другую архитектуру.
  • SOA: Сейчас применяется реже из-за сложности. Может быть оправдана для очень крупных корпоративных систем.
  • Микросервисы: Современный стандарт для сложных, высоконагруженных и масштабируемых приложений. Выбор зависит от готовности команды к сложностям операционной поддержки.

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