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.
Você obterá um sistema que é arquitetonicamente mais frouxamente acoplado se você emitir apenas eventos de um comando. Em outras palavras, um comando não precisa saber quais outros comandos externos devem ser emitidos; isso deve ser de responsabilidade da parte externa (que deve se inscrever no evento e pode ser, como você mencionou, um gerente de saga com responsabilidades de coordenação ou apenas outro módulo que depende desses eventos).
fonte
Visualização recomendada: Udi Dahan em Reliable Messaging - não é exatamente o que você está descrevendo, mas está intimamente relacionado.
Não vi ninguém recomendando essa prática.
Resposta curta: se você não salvar algum estado, não poderá recuperar o comando enfileirado se travar após confirmar que o recebeu.
Se você decidir salvar o estado, não está claro que haja grande vantagem em agendar o segundo comando desde o primeiro, em vez de usar um manipulador de eventos.
fonte