In CQRS / ES, un comando viene inviato dal client al server e instradato al gestore comandi appropriato. Quel gestore comandi carica un aggregato dal suo repository, chiama un metodo su di esso e lo salva nel repository. Gli eventi sono generati. Un gestore di eventi / saga / gestore di processi può ascoltare questi eventi per emettere comandi.
Quindi, i comandi (input) producono eventi (output), che possono quindi reimmettere nel sistema più comandi (input). Ora, è pratica comune che un comando non emetta alcun evento, ma piuttosto che accoda un altro comando? Tale approccio potrebbe essere utilizzato per forzare l'esecuzione in un processo esterno.
EDIT:
Il caso d'uso specifico che ho in mente è l'elaborazione dei dettagli di pagamento. Il client invia un comando PayInvoice
, il cui payload include i dati della carta di credito dell'utente. Il PayInvoiceHandler
passa un comando MakeInvoicePayment
a un processo separato, che è responsabile dell'interazione con il gateway di pagamento. Se il pagamento ha esito positivo, viene generato un evento InvoicePaid
. Se per qualche motivo il sistema si arresta in modo anomalo dopo la permanenza del comando PayInvoice
ma prima che il comando MakeInvoicePayment
venga mantenuto, possiamo tenerlo tracciato manualmente (nessun pagamento sarà stato eseguito). Se il sistema si blocca dopo che il comando MakeInvoicePayment
è persistuto ma prima che l'evento InvoicePaid
venga mantenuto, potremmo avere una situazione in cui la carta di credito dell'utente viene addebitata ma la fattura non è contrassegnata come pagata. In tal caso, la situazione dovrebbe essere esaminata manualmente e la fattura verrà contrassegnata manualmente come pagata.