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.
Obtendrá un sistema que está arquitectónicamente acoplado más libremente si solo emite eventos desde un comando. Dicho de otra manera, un comando no debería necesitar saber qué otros comandos externos emitir; esa debería ser la responsabilidad de la parte externa (quien debería suscribirse al evento y podría ser, como usted mencionó, un gerente de saga con responsabilidades de coordinación, o simplemente otro módulo que depende de esos eventos).
fuente
Visualización recomendada: Udi Dahan sobre mensajería confiable : no es exactamente lo que está describiendo, sino que está estrechamente relacionado.
No he visto a nadie recomendar esa práctica.
Respuesta corta: si no guarda algún estado, entonces no puede recuperar el comando en cola si se bloquea después de reconocer que lo ha recibido.
Si decide que necesita guardar el estado, no está claro que haya una gran ventaja en programar el segundo comando desde el primero, en lugar de usar un controlador de eventos.
fuente