2010-06-01 7 views
5

Bei dem Versuch, mich mit CQRS (und DDD im Allgemeinen) zu befassen, bin ich auf Situationen gestoßen, in denen zwei Ereignisse auf verschiedenen Aggregaten auftreten, deren Reihenfolge jedoch Domänenbedeutung hat. Wenn dies der Fall ist, könnten sie so nahe beieinander liegen, dass ein Zeitstempel (wie von den Beispielimplementierungen, die ich gesehen habe) sie nicht unterscheiden kann, was bedeutet, dass der Ereignisspeicher keine vollständige Darstellung der Domäne enthält, da die Reihenfolge mehrdeutig ist in denen Ereignisse aufgetreten sind.In CQRS (ereignisgesteuert) benötigen Sie einen globalen Sequenzzähler im Ereignisspeicher?

Als Beispiel könnte die Domäne ein CustomerCreatedEvent Feuer, das Customer Aggregat auf das gilt, und dann ein CustomerAssignedToAgent Ereignis auf das Agent Aggregat. Das Ereignis CustomerAssignedToAgent macht keinen Sinn, wenn es vor der CustomerCreatedEvent auftritt, aber normalerweise werden beide als Ergebnis einer Operation ausgelöst, die es wahrscheinlich macht, dass die Zeitstempel tatsächlich gleich sind.

Also modelliere ich nur Dinge schlecht? Sollte es jemals eine Situation geben, in der die Abfolge von Ereignissen über verschiedene Aggregate hinweg wichtig ist? Oder sollten Sie eine globale Sequenznummer in Ihrem Ereignisspeicher aufbewahren, damit Sie die genaue Reihenfolge identifizieren können, in der Ereignisse aufgetreten sind?

Antwort

5

Im Allgemeinen ist es eine schlechte Idee, globale Ordnung durchzusetzen. Aggregate sollen ACID-Semantikgrenzen bilden.

Dies bedeutet, dass zwei Aggregate nicht in einer Transaktion aktualisiert werden sollten und es keine andere Möglichkeit gibt, die globale Reihenfolge zu erzwingen.

In Ihrem Fall könnte es Sinn machen, dass CustomerCreatedEvent zusammen mit dem Erstellen einer Nachricht eine Nachricht an das Agent-Aggregat sendet, in der es sich anweist, sich selbst zuzuweisen. Im Allgemeinen sollte die Kommunikation zwischen den Aggregaten über Messaging erfolgen.

+0

Dank Szymon, dachte ich, das war der wahrscheinlichste Fall! –

+0

Ich habe die gleichen Male gelesen, aber ... wenn Sie Ihren EventStore als Warteschlange verwenden, um Ereignisse aus anderen beschränkten Kontexten oder sogar für das gleiche BC, in dem sie generiert werden, zu konsumieren, wie können Sie sicher sein, dass Sie sie bekommen in Ordnung? Sie brauchen sie nicht in einer sehr strengen Reihenfolge, aber Sie müssen sie zumindest ab einem bestimmten Offset konsumieren können. – Papipo

5

Ich fand auch this post by Greg Young auf der domaindrivendesign yahoo Liste:

Bestellung wird nur per Handler innerhalb eines Aggregats Wurzelgrenze gewährleistet.

Es gibt keine Garantie für die Reihenfolge zwischen Handlern oder zwischen Aggregaten.

Der Versuch, diese Dinge zu liefern führt auf die dunkle Seite.

Verwandte Themen