Básicamente estoy tratando de entender el concepto de CQRS y conceptos relacionados.
Aunque CQRS no necesariamente incorpora la mensajería y la búsqueda de eventos, parece ser una buena combinación (como se puede ver con muchos ejemplos / publicaciones de blog que combinan estos conceptos)
Dado un caso de uso para un cambio de estado para algo (por ejemplo, para actualizar una Pregunta sobre SO), ¿consideraría que el siguiente flujo es correcto (como en la mejor práctica)?
El sistema emite un UpdateQuestionCommand agregado que se puede separar en un par de comandos más pequeños: UpdateQuestion que está dirigido a la raíz agregada de la pregunta y UpdateUserAction (para contar puntos, etc.) dirigido a la raíz agregada del usuario. Estos se envían de forma asincrónica utilizando mensajes punto a punto.
Las raíces agregadas hacen lo suyo y, si todo va bien, activan los eventos QuestionUpdated y UserActionUpdated respectivamente, que contienen el estado que se subcontrata a una tienda de eventos ... para ser persistido yadayada, solo para ser completo, no es realmente el punto aquí.
Estos eventos también se colocan en una cola de pub / sub para su difusión. Cualquier suscriptor (entre los que probablemente uno o varios proyectores que crean las vistas de lectura) es libre de suscribirse a estos eventos.
La pregunta general: ¿es realmente la mejor práctica, que los comandos se comuniquen punto a punto (es decir: el receptor es conocido) mientras que los eventos se transmiten (es decir, se desconocen los receptores)?
Suponiendo lo anterior, ¿cuál sería la ventaja / desventaja de permitir que los comandos se transmitan a través de pub / sub en lugar de punto a punto?
Por ejemplo: al transmitir Comandos mientras se usa Saga, podría ser un problema, ya que el papel de mediación que una Saga debe jugar en caso de falla de una de las raíces agregadas se ve obstaculizado, porque la saga no sabe qué raíces agregadas participan para comenzar. .
Por otro lado, veo ventajas (flexibilidad) cuando se permite transmitir comandos.