Estou basicamente tentando entender o conceito de CQRS e conceitos relacionados.
Embora o CQRS não incorpore necessariamente o Messaging e o Event Sourcing, parece ser uma boa combinação (como pode ser visto com muitos exemplos / postagens de blog combinando esses conceitos)
Dado um caso de uso para uma alteração de estado de alguma coisa (digamos, para atualizar uma Pergunta no SO), você consideraria o fluxo a seguir correto (como na melhor prática)?
O sistema emite um UpdateQuestionCommand agregado, que pode ser separado em alguns comandos menores: UpdateQuestion, direcionado à Raiz Agregada de Perguntas, e UpdateUserAction (para contar pontos, etc.), direcionado à Raiz Agregada do Usuário. Eles são enviados de forma assíncrona usando mensagens ponto a ponto.
As raízes agregadas fazem o que precisam e, se tudo der certo, os eventos QuestionUpdated e UserActionUpdated, respectivamente, que contêm o estado terceirizado para um armazenamento de eventos.
Esses eventos também são colocados em uma fila de pub / sub para transmissão. Qualquer assinante (entre os quais provavelmente um ou vários projetores que criam as visualizações de leitura) é livre para se inscrever nesses eventos.
A questão geral: é de fato a melhor prática que os comandos sejam comunicados ponto a ponto (ou seja: o receptor é conhecido) enquanto os eventos são transmitidos (ou seja, o (s) receptor (es) é desconhecido)?
Supondo o que foi dito acima, qual seria a vantagem / desvantagem de permitir que os Comandos fossem transmitidos através de pub / sub em vez de ponto a ponto?
Por exemplo: ao transmitir comandos enquanto estiver usando Saga's pode ser um problema, pois o papel de mediação que um Saga precisa desempenhar em caso de falha de uma das raízes agregadas é prejudicado, porque a saga não sabe quais raízes agregadas participam para começar. .
Por outro lado, vejo vantagens (flexibilidade) quando comandos de transmissão são permitidos.