Чи слід використовувати команду чи подію?


14

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

Розглянемо приклад:

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

Створення облікового запису - це, здається, є правильним місцем для відправки CreateUserCommandна шину та дозволу спеціалізованому компоненту обробляти це.

А може, це навіть не слід реалізовувати за допомогою асинхронного зв’язку на шині? Ми хочемо, щоб користувач міг одразу увійти в програму. З шиною у нас немає гарантії, коли команда буде виконуватися.

Відправлення електронної пошти - після того, як компонент створить обліковий запис, я бачу 2 можливості

  1. Надішліть ще одну команду в автобус SendConfirmationEmailCommand
  2. Опублікуйте подію UserAccountCreatedEvent

І ніж нехай компонент відправника електронної пошти схопить його та його роботу.

З одного боку, я хочу, щоб електронний лист для підтвердження надсилався лише один раз (використовуйте команду), а з іншого боку, я вважаю, що в новозареєстрованих користувачів можуть бути зацікавлені кілька компонентів. Реєстратор або, можливо, відправник SMS.

Як би ти це реалізував?

Відповіді:


16

У принципі, команда описує запит, який повинен бути виконаний, тоді як подія описує те, що сталося:

  • Команда вимагає виконання певної дії процесором, і ця дія повинна бути виконана лише один раз цим процесором.

  • Подія - це повідомлення про якусь дію, яка вже була виконана, або про зовнішню подію. Кілька процесорів / агентів можуть бути зацікавлені дізнатися про подію. Деякі з них можуть видавати команди чи дії, необхідні цим сповіщенням у межах своєї відповідальності.

У вашому сценарії я розумію, що:

  • CreateUserCommand це команда
  • UserAccountCreatedEvent- це подія, яка повинна бути видана після CreateUserCommandуспішного завершення службою управління обліковими записами

Зараз є дві можливості:

  1. Служба управління обліковими записами видає себе SendConfirmationEmailCommandна шину, оскільки очікує, що цю команду виконує більш спеціалізована служба.
  2. Служба управління обліковим записом не більше, ніж надсилає сповіщення про подію після завершення, і залишає іншій службі (наприклад, послузі зв’язку, послугу передплати тощо), рішення про те, чи слід надсилати електронну пошту / sms / тощо ... і якщо Необхідно видати SendConfirmationEmailCommandкоманду, яку слід виконати деяким шлюзом.

Якщо ви обрали підхід службової шини, було б доцільно використовувати гнучкість, яку це дозволяє, тобто надавати перевагу варіанту 2.


Дякую, це очищує речі. Ще два питання щодо варіанту 2: 1. Як служба управління рахунками дізнається про завершення команди? Я вважаю, що це прослуховування подій, опублікованих спеціалізованими службами після завершення їхніх завдань - ніж яка реальна мета служби управління обліковими записами? Щоб перевидати події? Це здається зайвим. 2. Я також не розумів, хто повинен видати SendConfirmationEmailCommand. Служба управління обліковими записами чи "інша послуга"?
Анджей Гіс

1) моє припущення полягало в тому, що служба управління обліковими записами виконувала завдання і надсилала подію, коли її завершено успішно (тобто не було помилок). Але ви маєте рацію: можливо, служба управління обліковими записами передає собі команди на постійну службу / службу бази даних і повинна контролювати події завершення роботи (наприклад, асинхронна відповідь).
Крістоф

@ gisek 2) в службовій шині, я б уявив, що у вас є дуже спеціалізовані служби, кожен з яких обмежений. У цьому випадку Управління акаунтами виконує лише створення та повідомляє того, хто зацікавлений, що це зроблено. Потім якась інша служба моніторуватиме реакції на реагування. Наприклад, у вас може бути менеджер із зв’язку, який повинен відповідати правилам бізнесу, щоб вирішити, коли і як повідомляти події користувачам. Якби ви зробили 1) +2) в одній службі, навряд чи вам знадобиться службова шина.
Крістоф
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.