En CQRS / ES, se envía un comando desde el cliente al servidor y se enruta al controlador de comandos apropiado. Ese controlador de comandos carga un agregado desde su repositorio, llama a algún método y lo guarda de nuevo en el repositorio. Se generan eventos. Un controlador de eventos / saga / administrador de procesos puede escuchar estos eventos para emitir comandos.
Entonces, los comandos (entrada) producen eventos (salida), que luego pueden retroalimentar al sistema más comandos (entrada). Ahora, ¿es una práctica común que un comando no emita ningún evento, sino que ponga en cola otro comando? Tal enfoque podría usarse para forzar la ejecución en un proceso externo.
EDITAR:
El caso de uso específico que tengo en mente es el procesamiento de los detalles de pago. El cliente envía un PayInvoice
comando, cuya carga incluye los detalles de la tarjeta de crédito del usuario. El PayInvoiceHandler
pasa un MakeInvoicePayment
comando a un proceso separado, que es responsable de interactuar con la pasarela de pago. Si el pago se realiza correctamente, InvoicePaid
se genera un evento. Si por alguna razón el sistema falla después de que el PayInvoice
comando persiste pero antes de que el MakeInvoicePayment
comando persista, podemos rastrearlo manualmente (no habrá pasado ningún pago). Si el sistema falla después de que el MakeInvoicePayment
comando persiste pero antes deInvoicePaid
el evento persiste, es posible que tengamos una situación en la que se cargue a la tarjeta de crédito del usuario pero la factura no se marque como pagada. En ese caso, la situación tendría que ser investigada manualmente y la factura marcada manualmente como pagada.