Я в основном пытаюсь обернуть голову вокруг концепции CQRS и связанных понятий.
Хотя CQRS не обязательно включает в себя Messaging и Event Sourcing, кажется, что это хорошая комбинация (как видно из множества примеров / блогов, объединяющих эти концепции)
Учитывая вариант использования для изменения состояния чего-либо (скажем, для обновления Вопроса о SO), считаете ли вы следующий поток правильным (как в передовой практике)?
Система выдает агрегатный UpdateQuestionCommand, который можно разделить на несколько более мелких команд: UpdateQuestion, который предназначен для корня совокупного вопроса, и UpdateUserAction (для подсчета точек и т. Д.), Ориентированного на корень совокупного пользователя. Они отправляются асинхронно с использованием обмена сообщениями точка-точка.
Агрегированные корни делают свое дело, и, если все идет хорошо, запускают события QuestionUpdated и UserActionUpdated соответственно, которые содержат состояние, которое передается в хранилище событий ... чтобы быть сохраненным yadayada, просто чтобы быть полным, не совсем в этом дело.
Эти события также помещаются в паб / подпоследовательность для трансляции. Любой подписчик (среди которых, вероятно, один или несколько проекторов, создающих представления для чтения) могут подписаться на эти события.
Общий вопрос: действительно ли лучше всего, чтобы команды передавались точка-точка (то есть: получатель известен), тогда как события передаются (т. Е. Получатель (получатели) неизвестны)?
Исходя из вышесказанного, каково было бы преимущество / недостаток, позволяющий транслировать Команды через pub / sub вместо двухточечной?
Например: при трансляции команд во время использования Saga могут возникнуть проблемы, поскольку Saga должна играть посредническую роль в случае сбоя одного из агрегатных корней, поскольку сага не знает, какие агрегатные корни участвуют с самого начала. ,
С другой стороны, я вижу преимущества (гибкость), когда команды вещания будут разрешены.