Niedawno zacząłem nurkować w CQRS / ES, ponieważ może być konieczne zastosowanie go w pracy. W naszym przypadku wydaje się to bardzo obiecujące, ponieważ rozwiązałoby wiele problemów.
Naszkicowałem swoje przybliżone zrozumienie tego, jak aplikacja ES / CQRS powinna wyglądać w kontekście w uproszczonej bankowości (wypłata pieniędzy).
Podsumowując, jeśli osoba A wypłaci trochę pieniędzy:
- wydano polecenie
- polecenie zostaje przekazane do weryfikacji / weryfikacji
- zdarzenie jest wypychane do magazynu zdarzeń, jeśli sprawdzanie poprawności się powiedzie
- agregator anuluje zdarzenie, aby zastosować modyfikacje agregatu
Z tego, co zrozumiałem, dziennik zdarzeń jest źródłem prawdy, ponieważ jest to dziennik FAKTÓW, możemy zatem z niego wyprowadzić każdą projekcję.
Teraz, czego nie rozumiem, w tym wielkim schemacie rzeczy, dzieje się w tym przypadku:
- reguła: saldo nie może być ujemne
- osoba A ma saldo 100e
- osoba A wydaje Wycofanie Komendy o wartości 100e
- sprawdzanie poprawności mija i następuje wydarzenie MoneyWithdrewEvent of 100e
- w międzyczasie osoba A wydaje kolejną komendę Wycofania o wartości 100e
- pierwszy MoneyWithdrewEvent nie został jeszcze zagregowany, dlatego też sprawdzanie poprawności przebiega pomyślnie, ponieważ sprawdzanie poprawności względem zagregowanego (które nie zostało jeszcze zaktualizowane)
- MoneyWithdrewEvent of 100e jest emitowany innym razem
==> Jesteśmy w niespójnym stanie równowagi na poziomie -100e, a dziennik zawiera 2 MoneyWithdrewEvent
Jak rozumiem, istnieje kilka strategii radzenia sobie z tym problemem:
- a) umieść identyfikator wersji zagregowanej wraz ze zdarzeniem w magazynie zdarzeń, więc jeśli podczas modyfikacji wystąpi niezgodność wersji, nic się nie stanie
- b) zastosować pewne strategie blokowania, co oznacza, że warstwa weryfikacyjna musi jakoś je utworzyć
Pytania dotyczące strategii:
- a) W takim przypadku dziennik zdarzeń nie jest już źródłem prawdy, jak sobie z tym poradzić? Wróciliśmy również do klienta OK, chociaż zezwolenie na wypłatę było całkowicie błędne, czy w takim przypadku lepiej jest użyć zamków?
- b) Zamki == impasy, czy masz wgląd w najlepsze praktyki?
Ogólnie, czy rozumiem, jak radzić sobie z współbieżnością?
Uwaga: Rozumiem, że ta sama osoba wypłacająca dwa razy pieniądze w tak krótkim czasie jest niemożliwa, ale wziąłem prosty przykład, aby nie zagubić się w szczegółach