Вопрос с собеседования · System design

Что такое гексагональная архитектура (порты и адаптеры) и чем она отличается от слоистой?

MiddleМонолит и микросервисы
Ещё спрашивают так:
  • Что такое чистая архитектура?
  • Зачем отделять домен от фреймворка и базы данных?
Коротко

Домен в центре и не зависит ни от чего внешнего. Он объявляет порты — интерфейсы на своём языке: входящие (сценарии использования) и исходящие (OrderRepository, PaymentGateway). Адаптеры снаружи реализуют их: REST-контроллер, JPA-репозиторий, клиент Kafka. Все зависимости направлены внутрь.

  • Слоистая: контроллер → сервис → репозиторий, и бизнес-логика зависит от слоя данных
  • Гексагональная переворачивает эту стрелку через DIP
  • Домен тестируется без БД и фреймворка — подменой адаптеров

А ещё Чистая и луковая архитектуры — варианты той же идеи

Подробно

Проблема слоистой архитектуры. Сервис зависит от репозитория, а репозиторий — от ORM. Бизнес-правила обрастают аннотациями JPA, исключениями драйвера, DTO фреймворка. Сменить базу или протестировать логику без неё трудно.

Порты и адаптеры (Алистер Кокберн):

  • домен — сущности и правила, без импорта фреймворков;
  • входящие порты — сценарии: PlaceOrder, CancelOrder;
  • исходящие порты — что домену нужно от мира: Orders, PaymentGateway, Clock;
  • входящие адаптеры вызывают сценарии: REST, консьюмер очереди, CLI, тесты;
  • исходящие адаптеры реализуют исходящие порты: JPA, HTTP-клиент, Kafka-продюсер.
[REST] → PlaceOrder → (домен) → Orders ← [JpaOrders]
                               → PaymentGateway ← [StripeClient]

Плюсы: домен тестируется быстрыми юнит-тестами с фейковыми адаптерами; инфраструктура заменяема; бизнес-код читается без шума.

Цена: больше интерфейсов и маппинга между доменными объектами и сущностями БД; для CRUD без правил это избыточно.

Критерий хорошего порта: он сформулирован в терминах домена — в нём нет слов SQL, JPA, HTTP, Entity.

Что хотят услышать

  • Домен, порты, адаптеры и направление зависимостей.
  • Отличие от слоистой архитектуры.
  • Плюсы и цена, когда избыточно.

Частые ошибки

  • Называть гексагональной архитектурой просто интерфейс над репозиторием Spring Data.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗Шесть обязательных слоёв, каждый вызывает только соседний
  • ✗То же, что слоистая архитектура, но контроллеры и репозитории лежат в одном пакете с бизнес-логикой
  • ✗Разбиение системы на шесть микросервисов
  • ✓Домен объявляет порты, адаптеры снаружи их реализуют, все зависимости направлены внутрь

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования