2010-06-01 12 views
5

Próbując zrozumieć moją CQRS (i ogólnie DDD), natknąłem się na sytuacje, kiedy dwa zdarzenia występują w różnych agregatach, ale ich kolejność ma znaczenie domenowe. Jeśli tak, to mogą się zdarzyć tak blisko siebie, że znacznik czasu (używany przez przykładowe implementacje, które widziałem) nie może ich rozróżnić, co oznacza, że ​​magazyn zdarzeń nie zawiera "pełnej" reprezentacji domeny, ponieważ istnieje niejasność w stosunku do kolejności w którym zdarzały się wydarzenia.Czy w CQRS (z uwzględnieniem zdarzeń) potrzebny jest globalny licznik sekwencji w magazynie zdarzeń?

Jako przykład, domena mogła wystrzelić CustomerCreatedEvent która dotyczy agregatu Customer, a następnie CustomerAssignedToAgent zdarzenie na kruszywa Agent. Zdarzenie CustomerAssignedToAgent nie ma sensu, jeśli występuje przed CustomerCreatedEvent, ale zazwyczaj oba z nich mogą zostać uruchomione w wyniku jednej operacji, która sprawia, że ​​znaczniki czasu będą faktycznie takie same.

Po prostu źle modeluję rzeczy? Czy kiedykolwiek dojdzie do sytuacji, w której kolejność zdarzeń w różnych agregatach jest ważna? A może powinieneś zachować globalny numer sekwencji w swoim magazynie zdarzeń, abyś mógł dokładnie określić kolejność zdarzeń?

Odpowiedz

5

Generalnie złym pomysłem jest wymuszenie porządku globalnego. Agregaty mają tworzyć granice semantyki ACID.

Oznacza to, że dwie agregaty nie powinny być aktualizowane w jednej transakcji i nie ma innych sposobów egzekwowania zamówienia globalnego.

W twoim przypadku może to mieć sens, że wraz z tworzeniem CustomerCreatedEvent Klient powinien wysłać wiadomość do Agenta agregującego, informując go o przypisaniu siebie. Zasadniczo komunikacja międzygrupowa powinna odbywać się za pośrednictwem wiadomości.

+0

Dzięki Szymon, pomyślałem, że to najbardziej prawdopodobny przypadek! –

+0

Czytałem te same partie razy, ale ... kiedy używasz swojego EventStore jako kolejki do używania zdarzeń z innych ograniczonych kontekstów lub nawet dla tego samego BC, w którym są generowane, jak możesz być pewien, że je otrzymasz w celu? nie potrzebujesz ich w bardzo ścisłej kolejności, ale przynajmniej musisz mieć możliwość skonsumowania ich z danego offsetu. – Papipo

5

Znalazłem również this post by Greg Young na domaindrivendesign listy Yahoo:

Zamówienie jest zapewniona tylko za pomocą uchwytu w ciągu łącznej granicy głównego.

Nie ma pewności co do porządku między handlerami lub między agregatami.

Próba dostarczenia tych rzeczy prowadzi do ciemnej strony.