2010-06-01 13 views
5

Al tratar de entender CQRS (y DDD en general) me he encontrado con situaciones cuando dos eventos ocurren en agregados diferentes, pero el orden de ellos tiene un significado de dominio. Si es así, podrían pasar tan juntos que una marca de tiempo (como la utilizada en las implementaciones de muestra que he visto) no puede diferenciarlos, lo que significa que el almacén de eventos no contiene una representación 'completa' del dominio ya que hay ambigüedad sobre el orden en que eventos ocurrieron.En CQRS (fuente del evento), ¿necesita un contador de secuencia global en la tienda de eventos?

A modo de ejemplo, el dominio podría disparar un CustomerCreatedEvent que se aplica al agregado Customer, y después de un evento CustomerAssignedToAgent sobre el agregado Agent. El evento CustomerAssignedToAgent no tiene sentido si ocurre antes del CustomerCreatedEvent, pero normalmente ambos pueden dispararse como resultado de una operación que hace que sea probable que las marcas de tiempo sean efectivamente las mismas.

Entonces, ¿estoy modelando cosas mal? ¿Debería haber alguna vez una situación en la que la secuencia de eventos en diferentes agregados sea importante? ¿O debería mantener un número de secuencia global en su tienda de eventos, para que pueda identificar la secuencia exacta en la que ocurrieron los eventos?

Respuesta

5

En general, es mala idea hacer cumplir el pedido global. Los agregados están destinados a formar límites ACID-semántica.

Esto significa que dos agregados no se deben actualizar en una transacción y no hay otro medio para hacer cumplir la orden global.

En su caso, podría tener sentido que, junto con la creación del cliente de CustomerCreatedEvent, envíe un mensaje al agregado del agente diciéndole que se asigne. En general, la comunicación entre los agregados debe hacerse a través de mensajes.

+0

Gracias Szymon, ¡pensé que ese era el caso más probable! –

+0

He leído la misma cantidad de veces, pero ... cuando usa EventStore como cola para consumir eventos de otros contextos delimitados, o incluso para el mismo BC en el que se generan, ¿cómo puede estar seguro de que los obtiene? ¿en orden? no los necesita en un orden muy estricto, pero al menos necesita poder consumirlos a partir de una compensación determinada. – Papipo

5

También encontré this post by Greg Young en la lista de yahoo domaindrivendesign:

orden sólo está asegurada por un controlador dentro de un límite de raíz agregado.

No hay garantía de orden entre los manipuladores o entre los agregados.

Tratar de proporcionar esas cosas conduce al lado oscuro.

Cuestiones relacionadas