Что такое сервис-ориентированная архитектура
Что проверяют
Не заучено ли определение, а понимаете ли вы, чем сервис-ориентированная архитектура отличается от микросервисов и от монолита, разнесённого по проектам. На собеседовании это почти всегда предисловие к вопросам про контракты, границы и распределённые данные.
Как отвечать
Сервис-ориентированная архитектура это подход, при котором система собирается из сервисов, каждый закрывает бизнес-функцию и доступен только через явный контракт. Принципы стоит назвать своими словами: контракт вместо общего кода, слабая связанность, автономность, возможность переиспользования и сборки сервисов в бизнес-процесс.
В мире .NET путь от SOAP и WSDL к REST и gRPC прошли почти все, и на этом удобно показать главное: контракт всегда описан отдельно от реализации, раньше схемой, сейчас спецификацией или файлом protobuf.
Отличие от микросервисов назвать нужно обязательно, иначе ответ выглядит книжным. В классической SOA сервисы крупные, часто общаются через шину с логикой маршрутизации и преобразования и нередко делят базу. Микросервисы это уточнение того же подхода: логика на концах, простой канал между ними, собственное хранилище у каждого сервиса, независимый выпуск.
Уместно добавить, где подход болит: сетевой вызов вместо обращения в памяти, отсутствие общей транзакции, версионирование контрактов и рост числа точек отказа.
Где спотыкаются
Называют сервисами то, что просто разнесено по проектам, но ходит в одну базу и выкатывается одним релизом. Получается распределённый монолит: сложность распределённой системы уже есть, независимости выпуска ещё нет.
Обещают распределённую транзакцию через двухфазный коммит. В боевых системах так почти не делают: вместо этого сага с компенсациями, идемпотентные обработчики и итоговая согласованность, о которой бизнес предупреждён заранее.
Отдают наружу внутреннюю модель, чаще всего сущности ORM. Любое изменение схемы хранения тут же ломает потребителей. Контракт должен жить отдельно, а правила совместимости быть явными: поле добавить можно, удалить или переименовать нельзя.