2015-09-28 44 views
5

Proszę wyjaśnić, dlaczego modyfikowanie wielu agregatów w tym samym czasie jest złym pomysłem podczas wykonywania CQRS, ES i DDD. Czy są jakieś sytuacje, w których nadal może być OK?Dlaczego ograniczać polecenia i zdarzenia do jednego agregatu? CQRS + ES + DDD

Weźmy na przykład polecenie takie jak PurgeAllCompletedTodos. Chcę, aby to polecenie prowadziło do jednego zdarzenia, które aktualizuje stan każdego ukończonego agregatu Todo, ustawiając wartość IsActive na wartość false.

Dlaczego to nie jest dobre?

Jednym z powodów mogę myśleć:

Podczas aktualizowania stanu domeny to chyba dobrze, aby ograniczyć transakcję do precyzyjnie określonej części całego państwa tak, że tylko ta część musi być zabezpieczony przed zapisem podczas aktualizacji. Pozwoli to na wiele zapisów na różnych agregatach w równaniu, co może zwiększyć wydajność w niektórych ekstremalnie ciężkich scenariuszach.

+0

"Czy zdarzenie * nie * może w ogóle zaktualizować żadnego stanu domeny?" i "Po co ograniczać polecenia i zdarzenia do 1 agregacji?" wydają mi się dwa oddzielne, niepowiązane ze sobą pytania. – guillaume31

+0

Tak, masz rację. Zmienię pytanie. –

+0

Przeniosłem drugą część mojego pytania tutaj: http://stackoverflow.com/questions/32823747/in-es-cqrs-ddd-can-a-event-not-update-any-real-domain-state- w ogóle –

Odpowiedz

9

Odpowiedź na pytanie dotyczy "agregatu".

Najpierw powiedziałbym, że nie modyfikujesz agregatów "n", ale modyfikujesz "n" jednostek.

Agregat zawiera więcej niż jeden podmiot i jest to tylko transakcja pojęcie, łączna (wzór) jest stosowany, gdy trzeba modyfikować stan więcej niż jednego podmiotu w aplikacji transakcyjnie (wszystko są modyfikowane lub żadne).

Po co modyfikować więcej niż jeden agregat za pomocą jednego polecenia?

Jeśli uważasz, że to konieczne, przed zrobieniem czegokolwiek, sprawdź swoje granice agregacji, aby sprawdzić, czy możesz je zmodyfikować, aby usunąć potrzeby do 1 komendy -> 'n' agregatu.

Agregat można zawiera wiele jednostek tego samego typu, więc na polecenie PurgeAllCompletedTodos, można również pomyśleć o poszerzyć granicę transakcji z jednym Todo do łącznej UserTodosAggregate, który zawiera wszystkie user todos, i pozwól mu zarządzać wszystkimi poleceniami dla todos jednego użytkownika.
W ten sposób można modyfikować wszystkie taty użytkownika w pojedynczej transakcji.

Jeśli to nadal nie rozwiąże problemu, ponieważ, powiedzmy, że jest potrzebne do oczyszczenia wszystkich zakończonych zadań każdego użytkownika w aplikacji, nadal będziesz musiał wysłać polecenie do agregatów "n", łączna granica nie Pomagamy, więc możemy pomyśleć o tym, że zarządzamy poleceniem. AllApplicationTodosAggregate
Prawdopodobnie nie jest to najlepsze rozwiązanie, ponieważ, jak powiedziałeś, polecenie to zablokuje WSZYSTKIE taty w aplikacji, ale zawsze sprawdź, czy może to być dobry kompromis (ta część blokowania jest bardzo dobrze wyjaśniona w obie Niebieska Księga i Czerwona Księga DDD).

Co się stanie, jeśli będę musiał zmodyfikować niektóre encje i nie mogę ich mieć w jednym agregacie?

Po wcześniejszym powiedziane polecenie, które modyfikuje więcej niż jeden agregat, jest złe z powodu transakcji. Co się stanie, jeśli zmodyfikujesz 3 agregaty, pierwszy jest dobry, a następnie serwer zostanie zamknięty?

W tym przypadku użytkownik wykonuje wiele pojedynczych modyfikacji, którymi należy zarządzać, aby zapobiec niespójności systemu. Można to zrobić za pomocą menedżera procesów, którego zakresy odpowiedzialności modyfikują wszystkie agregaty wysyłając odpowiednie komendy i zarządzając awariami, jeśli tak się stanie.

Agregat nadal otrzymywać swoje własne polecenia, ale kierownik proces jest odpowiedzialny za wysyłanie ich w taki sposób, że wie (po jednym na raz, wszystko równolegle, 5 na raz, co-do-you-want)
Możesz więc mieć strategię zarządzania awarią między dwiema transakcjami i podjąć decyzję: "jeśli coś zawiedzie, wycofaj wszystkie modyfikacje wykonane do tej pory" (wysłanie polecenia wycofania do każdego agregatu) lub "jeśli operacja się nie powiedzie" to 3 razy co 30 minut i jeśli nie działa, a następnie wycofuje "," jeśli coś nie działa, utwórz powiadomienie dla administratora systemu ".

(przepraszam za długi wpis, przynajmniej mam nadzieję, że to pomaga)

+0

Świetne wyjaśnienie. Bardzo dobrze wyjaśnione. Dzięki! – Chris