No CQRS / ES, um comando é enviado do cliente para o servidor e roteado para o manipulador de comando apropriado. Esse manipulador de comando carrega um agregado de seu repositório, chama algum método e salva de volta no repositório. Eventos são gerados. Um manipulador de eventos / saga / gerenciador de processos pode ouvir esses eventos para emitir comandos.
Portanto, os comandos (entrada) produzem eventos (saída), que podem então retornar ao sistema mais comandos (entrada). Agora, é prática comum para um comando não emitir nenhum evento, mas enfileirar outro comando? Essa abordagem pode ser usada para forçar a execução em um processo externo.
EDITAR:
O caso de uso específico que tenho em mente é o processamento dos detalhes do pagamento. O cliente envia um PayInvoice
comando cuja carga útil inclui os detalhes do cartão de crédito do usuário. O PayInvoiceHandler
passa um MakeInvoicePayment
comando para um processo separado, responsável pela interação com o gateway de pagamento. Se o pagamento for bem sucedido, um InvoicePaid
evento será gerado. Se, por algum motivo, o sistema travar após o PayInvoice
comando persistir, mas antes do MakeInvoicePayment
comando persistir, podemos rastrear isso manualmente (nenhum pagamento será realizado). Se o sistema travar após o MakeInvoicePayment
comando persistir, mas antes doInvoicePaid
Se o evento persistir, podemos ter uma situação em que o cartão de crédito do usuário é cobrado, mas a fatura não é sinalizada como paga. Nesse caso, a situação teria que ser investigada manualmente e a fatura marcada manualmente como paga.