Sto fondamentalmente cercando di avvolgere la mia testa attorno al concetto di CQRS e concetti correlati.
Sebbene CQRS non includa necessariamente la messaggistica e il sourcing di eventi, sembra essere una buona combinazione (come si può vedere con molti esempi / blogposts che combinano questi concetti)
Dato un caso d'uso per un cambio di stato per qualcosa (diciamo per aggiornare una domanda su SO), considerereste corretto il seguente flusso (come nella migliore pratica)?
Il sistema emette un UpdateQuestionCommand aggregato che potrebbe essere separato in un paio di comandi più piccoli: UpdateQuestion che è mirato alla radice aggregata delle domande e UpdateUserAction (per contare punti, ecc.) Mirato alla radice aggregata dell'utente. Questi vengono inviati in modo asincrono utilizzando la messaggistica point-to-point.
Le radici aggregate fanno la loro parte e, se tutto va bene, attivano rispettivamente gli eventi QuestionUpdated e UserActionUpdated, che contengono lo stato che viene esternalizzato a un negozio di eventi .. per essere persistente yadayada, solo per essere completo, non proprio il punto qui.
Questi eventi vengono anche inseriti in una coda / pub per la trasmissione. Qualsiasi abbonato (tra cui probabilmente uno o più proiettori che creano le viste di lettura) è libero di iscriversi a questi eventi.
La domanda generale: è davvero buona prassi che i Comandi vengano comunicati punto a punto (ovvero: il ricevitore è noto) mentre gli eventi vengono trasmessi (vale a dire: i destinatari sono sconosciuti)?
Supponendo quanto sopra, quale sarebbe il vantaggio / svantaggio di consentire la trasmissione dei comandi attraverso pub / sub anziché punto-punto?
Ad esempio: quando si trasmettono comandi durante l'utilizzo di Saga potrebbe essere un problema, poiché il ruolo di mediazione che una Saga deve svolgere in caso di fallimento di una delle radici aggregate viene ostacolato, perché la saga non sa con quali radici aggregate partecipano .
D'altra parte, vedo vantaggi (flessibilità) quando sono consentiti i comandi di trasmissione.