В DDD являются ли команды строго синхронными вызовами API? - PullRequest
2 голосов
/ 06 августа 2020

Когда я читаю о команде в контексте DDD, это обычно описывается как вызов API.

В этом примере serviceA отправляет команду serviceB.

serviceA -> serviceB

В моем понимании команда - это конкретное действие над чем-то. Так что технически это также может быть в асинхронной форме. Возможно, отправка командного сообщения в очереди сообщений.

serviceA -> queue -> serviceB

Являются ли команды строго синхронными вызовами API или могут быть асинхронными?

1 Ответ

3 голосов
/ 08 августа 2020

Команды в контексте проектирования, управляемого доменом:

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

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

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

Команды могут запускаться / передаваться, например, следующими способами:

  • Выполнение некоторого синхронного запроса REST когда пользователь нажимает кнопку на веб-сайте
  • Отправка асинхронного сообщения (например, от одного микросервиса) в очередь сообщений получателя команд (например, другого микросервиса)
  • Выполнение gRP C вызов (например, от одного микросервиса к другому)
  • нажатие кнопки в пользовательском интерфейсе настольного приложения
  • Выполнение запланированной фоновой задачи

Команды в бизнес-контекст может быть, например:

  • Проверить текущую корзину покупок в интернет-магазине, чтобы инициировать заказ
  • Проголосовать и ответить на stackoverflow и увеличить голос ответа

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

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

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

TL; DR

Возвращаясь к вашим вопросам:

Когда я читаю о команде в контексте DDD, это обычно описывается как вызов API.

Сам вызов API - это просто представление технических данных и передача команды.

Являются ли команды строго синхронными вызовами API или могут быть асинхронными?

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

Итак, да, , конечно, может быть также асинхронный .

...