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

Сервисная архитектура: сводка по SOA и микросервисам

  1. SOA подходит, когда в приоритете интеграция большого корпоративного ландшафта и централизованный контроль.
  2. Микросервисы подходят, когда в приоритете скорость изменений продукта, автономия команд и независимые релизы.
  3. Ключевое отличие не в “модности”, а в операционной модели: governance, ownership данных, деплой и наблюдаемость.
  4. Для большинства команд сначала важнее навести порядок в доменной модели и CI/CD, чем дробить монолит.
  5. Гибридный сценарий практичен: SOA на уровне межсистемных интеграций, микросервисы внутри продуктового контура.

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

КритерийSOAМикросервисы
Основная цельИнтеграция корпоративных систем и reuse сервисовБыстрые независимые релизы внутри продукта
Размер сервисаКрупнее, вокруг бизнес-возможностейМеньше, вокруг ограниченного контекста
КоммуникацияЧасто через централизованную шину (ESB)Чаще REST/gRPC + события через брокер
GovernanceЦентрализованныйДецентрализованный по командам
ДанныеНередко общие модели/ресурсыКаждый сервис владеет своими данными
  1. Нужно связать много разнородных enterprise-систем (ERP, CRM, биллинг, legacy).
  2. Важнее единые корпоративные регламенты и централизованный контроль, чем скорость локальных релизов.
  3. Команда уже инвестировала в ESB, каталог сервисов и платформенный governance.
  1. Продукт развивается быстро, релизы идут часто и по независимым потокам.
  2. Есть зрелый DevOps: CI/CD, observability, контрактное тестирование, алертинг.
  3. Нужна автономия команд и независимое масштабирование отдельных доменных зон.
  1. Называют систему микросервисной, но держат общую БД и общий релизный цикл.
  2. Уходят в микросервисы без platform-инженерии, получая рост операционной сложности.
  3. Строят избыточный ESB-слой для продукта, где достаточно API Gateway + event-driven интеграций.
  • Формальные сервисные контракты и версионирование.
  • Каталог сервисов и единые правила интеграции.
  • Централизованная политика безопасности и аудита.
  • Четкие bounded contexts и отдельная ответственность за данные.
  • Наблюдаемость по умолчанию: логи, метрики, трассировка.
  • Автоматизированные релизы и rollback-стратегия на уровне каждого сервиса.
<?php
namespace App\Http\Controllers;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
final class BillingWebhookController
{
// Контракт фиксирует обязательные поля события между сервисами.
public function __invoke(Request $request): JsonResponse
{
$payload = $request->validate([
'event_id' => ['required', 'string'],
'event_type' => ['required', 'in:invoice.paid,invoice.failed'],
'occurred_at' => ['required', 'date'],
'customer_id' => ['required', 'string'],
'invoice_id' => ['required', 'string'],
]);
// Здесь можно вызвать application-service и записать event в inbox/outbox.
return response()->json(['accepted' => true, 'event_id' => $payload['event_id']]);
}
}

Этот пример полезен и для SOA, и для микросервисов: контракт валидируется на входе, а не «по договоренности в чате».

Пример события для асинхронной интеграции (JavaScript)

Заголовок раздела «Пример события для асинхронной интеграции (JavaScript)»
const invoicePaidEvent = {
eventId: "evt_2026_07_25_001",
eventType: "invoice.paid",
occurredAt: new Date().toISOString(),
customerId: "cust_42",
invoiceId: "inv_1001",
amount: { value: 14900, currency: "RUB" },
};
// Публикация в брокер (Kafka/RabbitMQ/NATS) делается в инфраструктурном адаптере.
publish("billing.events", invoicePaidEvent);
  1. Если ключевая задача - enterprise-интеграция большого ландшафта систем, стартуйте с SOA.
  2. Если ключевая задача - скорость вывода продуктовых изменений и автономия команд, берите микросервисы.
  3. Гибрид возможен: SOA на уровне корпоративных интеграций и микросервисы внутри продуктового контура.