En CQRS (evento de origen), ¿necesita un contador de secuencia global en el almacén de eventos?

StackOverflow https://stackoverflow.com/questions/2948523

  •  05-10-2019
  •  | 
  •  

Pregunta

Al tratar de conseguir mi cabeza alrededor CQRS (y DDD en general) me he encontrado con situaciones en las que dos eventos ocurren en diferentes agregados, pero el orden de ellos tiene un significado dominio. Si es así, es posible que ocurran tan juntos que una marca de tiempo (como el usado por las implementaciones de muestra que he visto) no puede diferenciarlos, es decir, el almacén de eventos no contiene una representación 'completa' del dominio ya que hay ambigüedad sobre el orden en el que ocurrieron los acontecimientos.

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 se produce antes de que el CustomerCreatedEvent, pero por lo general ambos podría ser despedido como resultado de una operación que hace que sea probable que las marcas de tiempo de manera efectiva sería la misma.

Así que solo estoy modelando las cosas mal? En caso de que alguna vez una situación en la que la secuencia de eventos a través de diferentes agregados es importante? ¿O hay que mantener un número de secuencia global en su almacén de eventos, por lo que se puede identificar la secuencia exacta en que ocurrieron los acontecimientos?

¿Fue útil?

Solución

En general es mala idea para hacer cumplir el orden mundial. Los agregados están destinados a formar límites ácido semántica.

Esto significa que dos agregados no deben ser actualizados en una transacción y no hay es otro medio de hacer cumplir el orden global.

En su caso podría tener sentido que, junto con la creación de CustomerCreatedEvent cliente debe enviar un mensaje al Agente agregada diciéndole que se asigne a sí mismo. Generalmente la comunicación inter-agregado se debe hacer a través de mensajería.

Otros consejos

este mensaje por Greg Young en el yahoo domaindrivendesign lista:

Orden está solamente asegurado por un controlador dentro de un límite de raíz agregado.

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

Tratando de brindarle esos cables al lado oscuro.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top