Я в основному намагаюся обернути голову навколо концепції CQRS та пов'язаних з цим понять.
Хоча CQRS не обов'язково включає в себе повідомлення та обмін подіями, це здається гарною комбінацією (як це можна побачити з великою кількістю прикладів / блогових постів, що поєднують ці поняття)
Враховуючи випадки використання для зміни стану для чогось (скажімо, щоб оновити запитання щодо SO), чи вважаєте ви наступний потік правильним (як у найкращій практиці)?
Система видає сукупний UpdateQuestionCommand, який може бути розділений на пару менших команд: UpdateQuestion, орієнтований на корінь питання агрегації, та UpdateUserAction (для підрахунку балів тощо), орієнтовані на коріння користувача агрегувати. Вони надсилаються асинхронно, використовуючи точкові повідомлення.
Сукупні корені роблять свою справу, і якщо все добре виходить з пожежних подій QuestionUpdated і UserActionUpdated відповідно, які містять стан, який передається в аутсорсинг магазину подій .., щоб він зберігався yadayada, просто щоб бути повним, не зовсім тут справа.
Ці події також ставлять у паб / під чергу для мовлення. Будь-який абонент (серед якого, ймовірно, один або кілька проекторів, які створюють «Перегляди»), може вільно підписатися на ці події.
Загальне питання: чи дійсно найкраща практика, що команди передаються командами «точка-точка» (тобто: приймач відомий), тоді як події транслюються (тобто: приймач (и) невідомі)?
Припускаючи вищевикладене, яка б була перевага / недолік, щоб дозволити трансляцію команд через pub / sub замість пункту до пункту?
Наприклад: Коли трансляція команд під час використання Saga може бути проблемою, оскільки роль посередництва, яку повинна відігравати Сага у разі відмови одного з сукупних коренів, перешкоджає, оскільки сага не знає, з яких агрегатних коренів бере участь. .
З іншого боку, я бачу переваги (гнучкість), коли команди трансляції будуть дозволені.