2010-06-01 11 views
5

Nel tentativo di orientarmi su CQRS (e DDD in generale) mi sono imbattuto in situazioni in cui due eventi si verificano su aggregati diversi ma l'ordine di questi ha un significato di dominio. In tal caso, potrebbero accadere in modo così ravvicinato che un timestamp (utilizzato dalle implementazioni di esempio che ho visto) non può differenziarli, il che significa che l'archivio eventi non contiene una rappresentazione "completa" del dominio in quanto vi è ambiguità sull'ordine in cui si sono verificati eventi.In CQRS (origine evento), è necessario un contatore di sequenza globale nell'archivio eventi?

A titolo di esempio, il dominio potrebbe sparare un CustomerCreatedEvent che si applica al Customer aggregata, e quindi un evento CustomerAssignedToAgent sul Agent aggregato. L'evento CustomerAssignedToAgent non ha senso se si verifica prima dello CustomerCreatedEvent, ma in genere entrambi possono essere attivati ​​come risultato di un'operazione che rende probabile che i timestamp siano effettivamente gli stessi.

Quindi sto solo modellando le cose male? Dovrebbe mai esserci una situazione in cui la sequenza di eventi tra diversi aggregati è importante? O dovresti tenere un numero di sequenza globale nel tuo negozio di eventi, in modo da poter identificare la sequenza esatta in cui si sono verificati gli eventi?

risposta

5

In generale è una cattiva idea applicare l'ordine globale. Gli aggregati sono pensati per formare i confini della semantica ACID.

Ciò significa che due aggregati non devono essere aggiornati in un'unica transazione e non vi sono altri mezzi per far rispettare l'ordine globale.

Nel tuo caso potrebbe aver senso che, insieme alla creazione di CustomerCreatedEvent, il Cliente debba inviare un messaggio all'Agente aggregato indicando di assegnarlo. Generalmente la comunicazione tra aggregati dovrebbe essere effettuata tramite messaggistica.

+0

Grazie Szymon, ho pensato che fosse il caso più probabile! –

+0

Ho letto lo stesso numero di volte, ma ... quando usi il tuo EventStore come coda per consumare eventi da altri contesti limitati, o anche per lo stesso BC in cui sono generati, come puoi essere sicuro di averli In ordine? non ne hai bisogno in un ordine molto rigoroso, ma almeno devi essere in grado di consumarli da un dato offset. – Papipo

5

Ho anche trovato this post by Greg Young sulla lista yahoo domaindrivendesign:

Ordine è garantita solo per un gestore entro un limite di radice di aggregazione.

Non esiste alcuna garanzia di ordine tra gestori o tra aggregati.

Cercare di fornire quelle cose porta al lato oscuro.

Problemi correlati