Zdaję sobie sprawę, że powyższe pytanie prawdopodobnie rodzi kilka „co?”, Ale spróbuję wyjaśnić:
Próbuję oprzeć głowę na kilku pokrewnych koncepcjach, w zasadzie wzorcu Saga ( http://www.rgoarchitects.com/Files/SOAPatterns/Saga.pdf ) w połączeniu z Event-Sourcing (koncepcja DDD) : http://en.wikipedia.org/wiki/Domain-driven_design )
Dobry post, który go otacza: https://blog.jonathanoliver.com/cqrs-sagas-with-event-sourcing-part-ii-of-ii/
Przechodzę do pytania za minutę, ale myślę, że najpierw muszę spróbować streścić to, co rozumiem (co może być nie tak, więc proszę popraw, jeśli tak jest), ponieważ może to mieć wpływ na to, dlaczego jestem zadając pytanie na początek:
- Wzorzec Saga jest rodzajem brokera, który wydał akcję (użytkownik końcowy, zautomatyzowany itp. Zasadniczo wszystko, co ma zmienić dane) dzieli tę akcję na działania biznesowe i wysyła każde z tych działań jako wiadomości do szyny komunikatów, która z kolei wysyła je do odpowiednich zagregowanych korzeni, którymi należy się zająć.
- Te zagregowane korzenie mogą działać całkowicie autonomicznie (ładne rozdzielenie problemów, świetna skalowalność itp.)
- Sama instancja Saga nie zawiera żadnej logiki biznesowej, która jest zawarta w zagregowanych korzeniach, do których wysyła działania. Jedyną „logiką” zawartą w Sadze jest logika „procesowa” (często implementowana jako Statemachine), która określa na podstawie otrzymanych działań (a także zdarzeń kontrolnych), co robić (tj. Jakie działania wysłać)
- Wzory Saga implementują rodzaj rozproszonego wzorca transakcji. Tj .: gdy jeden z zagregowanych korzeni (które znów działają autonomicznie, nie wiedząc o istnieniu siebie nawzajem) zawiedzie, cała akcja może wymagać wycofania.
- Jest to realizowane przez posiadanie wszystkich zagregowanych korzeni, po zakończeniu ich sprawozdania z działalności z powrotem do Sagi. (W przypadku sukcesu, jak i błędu)
- W przypadku, gdy wszystkie zagregowane korzenie zwrócą sukces, wewnętrzny statemachine, jeśli Saga określa, co dalej (lub zdecyduje, że to zrobione)
- W przypadku niepowodzenia Saga przekazuje wszystkim zagregowanym korzeniom, które brały udział w ostatnim działaniu, tak zwane Akcje kompensacyjne, tj .: działanie mające na celu cofnięcie ostatniego działania każdego z zagregowanych korzeni.
- Może to być po prostu „głosowanie minus 1”, jeśli akcja brzmiała „plus głos”, ale może to być bardziej skomplikowane, jak przywrócenie posta na blogu do jego poprzedniej wersji.
- Pozyskiwanie zdarzeń (patrz łączący oba posty na blogu) ma na celu zewnętrzne zapisanie wyników każdego działania, które każde z zagregowanych źródeł podejmuje w scentralizowanym magazynie zdarzeń (w tym kontekście zmiany nazywane są „zdarzeniami”)
- Ten magazyn zdarzeń jest „pojedynczą wersją prawdy” i można go użyć do odtworzenia stanu wszystkich bytów po prostu poprzez iterację przechowywanych zdarzeń (zasadniczo jak dziennik zdarzeń)
- Połączenie tych dwóch (tj. Zezwolenie na łączenie korzeni z wykorzystaniem Event-sourcingu w celu outsourcingu zapisywania ich zmian przed zgłoszeniem się do Sagi) daje wiele fajnych możliwości, z których jedna dotyczy mojego pytania ...
Czułem, że muszę to zdjąć z ramienia, ponieważ za jednym razem trzeba to dużo uchwycić. Biorąc pod uwagę ten kontekst / sposób myślenia (ponownie, proszę poprawić, jeśli jest źle)
pytanie: kiedy zagregowany root otrzyma akcję kompensacji i jeśli ten agregat root zlecił outsourcing zmian stanu za pomocą pozyskiwania zdarzeń, czy akcja kompensacji we wszystkich sytuacjach nie byłaby po prostu usunięciem ostatniego zdarzenia w magazynie zdarzeń biorąc pod uwagę Root Aggregate? (Zakładając, że implementacja trwała umożliwia usuwanie)
Miałoby to dla mnie wiele sensu (i byłaby kolejną wielką zaletą tej kombinacji), ale jak powiedziałem, mogę przyjmować te założenia w oparciu o niepoprawne / niepełne zrozumienie tych pojęć.
Mam nadzieję, że nie rozwinęło się to zbyt długo.
Dzięki.