Должен ли я использовать команду или событие?

14

Разница между командой и событием в автобусном сообщении мне кажется немного расплывчатой. Я знаю, что команды должны выполняться только один раз, в то время как событие может быть обработано несколько раз, но все же я не уверен, когда использовать команду или событие.

Давайте посмотрим на пример:

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

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

Или, может быть, это даже не должно быть реализовано с асинхронной коммуникацией по шине? Мы хотим, чтобы пользователь мог сразу войти в приложение. С шиной у нас нет гарантии, когда команда будет выполнена.

Отправка электронной почты - после того, как компонент создает учетную запись, я вижу 2 возможности

  1. Отправить еще одну команду на автобус SendConfirmationEmailCommand
  2. Опубликовать событие UserAccountCreatedEvent

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

С одной стороны, я хочу, чтобы электронное письмо с подтверждением отправлялось только один раз (используйте команду), с другой стороны, я считаю, что может быть несколько компонентов, заинтересованных в новых зарегистрированных пользователях. Регистратор или, возможно, отправитель SMS.

Как бы вы это реализовали?

Анджей Гис
источник

Ответы:

16

В принципе, команда описывает запрос, который должен быть выполнен, тогда как событие описывает что-то, что произошло:

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

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

В вашем сценарии я понимаю, что:

  • CreateUserCommand это команда
  • UserAccountCreatedEventсобытие, которое должно быть выдано после CreateUserCommandуспешного завершения службой управления учетными записями

Теперь есть две возможности:

  1. Служба управления учетными записями выдает себя SendConfirmationEmailCommandна шине, поскольку ожидает, что эта команда будет выполнена более специализированной службой.
  2. Служба управления учетными записями делает только отправку уведомления о событии по завершении и оставляет другой службе (например, службе связи, службе подписки и т. Д.) Решение о том, отправлять или не отправлять электронные письма / смс / и т. Д. ... и, если необходимо выдать SendConfirmationEmailCommandкоманду для выполнения каким-либо шлюзом.

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

Christophe
источник
Спасибо, это проясняет ситуацию. Еще два вопроса по варианту 2: 1. Как служба управления учетными записями узнает о выполнении команды? Я полагаю, что слушая события, опубликованные специализированными службами после выполнения своих задач, - какова реальная цель службы управления учетными записями? Переиздать события? Это кажется излишним. 2. Я также не понял, кто должен выдавать команду SendConfirmationEmailCommand. Сервис управления аккаунтом или «другой сервис»?
Анджей Гис
1) я предположил, что служба управления учетными записями выполнила свою работу и отправила событие, когда оно успешно завершилось (т.е. не обнаружило ошибок). Но вы правы: возможно, что служба управления учетными записями сама отправляет команды службе постоянства / базы данных и должна отслеживать событие завершения задания (например, асинхронный ответ).
Кристоф
@gisek 2) в сервисном автобусе, я представляю, что у вас есть очень специализированные сервисы, каждый из которых несет ограниченную ответственность. В этом случае Account Management только выполняет создание и уведомляет всех, кто заинтересован, что это сделано. Затем какой-то другой сервис будет отслеживать вещи, чтобы реагировать. Например, у вас может быть менеджер по коммуникациям, который будет отвечать за применение бизнес-правил, чтобы решить, когда и как сообщать о событиях пользователям. Если бы вы делали 1) +2) в одном и том же сервисе, вам вряд ли понадобился бы сервисный автобус.
Кристоф