Pozyskiwanie i trwałość zdarzeń

12

Czytam o pozyskiwaniu wydarzeń i mam pytanie dotyczące wytrwałości.

Nadal mogę mieć DB ze wszystkimi podmiotami, prawda? A może zdarzenia powinny być odtwarzane przy każdym uruchomieniu aplikacji, aby uzyskać najnowszą wersję każdego elementu w pamięci? Wydaje się to marnotrawstwem w większych systemach (jak w przypadku dużej ilości danych)?

Chodzi o to, że w razie potrzeby mogę odtworzyć zdarzenia, aby zapełnić magazyn danych? (lub analizuj dane)

jgauffin
źródło

Odpowiedzi:

9

Najkorzystniej skorzystasz z pozyskiwania zdarzeń, gdy zdecydujesz się również zmienić architekturę systemu. Dążenie do architektury w stylu CQRS w połączeniu z DDD przyniesie prawdziwe korzyści z pozyskiwania zdarzeń, przynajmniej moim zdaniem.

Zbudowanie magazynu zdarzeń, który zachowuje się dobrze w dużych systemach, nie jest łatwym zadaniem. Odtwarzanie wszystkich danych może być rzeczywiście kosztowne, zależy w dużej mierze od ilości danych, które należy odtworzyć. Są jednak techniki, które mogą ci w tym pomóc, jedną z nich jest koncepcja migawki. Powtórka jest wykonywana tylko od pewnego momentu. Korzyści, jakie sklep ze zdarzeniami wnosi do twojego systemu są nieocenione. Dzięki temu, że wszystko, co wydarzyło się w twoim systemie, jest możliwe do odtworzenia, wszystkie dane w każdej chwili to świetna rzecz. Pomyśl o analizie, o odtwarzaniu błędów, o statystykach.

Istnieje wiele świetnych sklepów z wydarzeniami, ostatni został właśnie wydany wczoraj Event Store i wygląda na naprawdę dobry.

Tradycyjna baza danych może być przechowywana dla części kwerendy twojego systemu, aby zbudować DTO z żądanymi danymi. Ta baza danych może być zorganizowana i zoptymalizowana z uwzględnieniem potrzeb zapytań twojej aplikacji i klientów.

Napisałem szczegółowy artykuł o tym, jakie są korzyści i jak naprawdę wygląda architektura CQRS w połączeniu z pozyskiwaniem zdarzeń. Możesz to sprawdzić w CQRS, zdarzeniach domenowych i przeglądzie DDD .

Vadim
źródło
1
Wiem wszystko o CQRS i DDD. Rozumiem korzyści płynące z pozyskiwania zdarzeń. Migawki to świetny sposób na przyspieszenie procesu. To jednak nie jest częścią pytania. Pytanie dotyczyło raczej miejsca, w którym wszystkie modele / byty będą przechowywane po załadowaniu. W pamięci (wymagałoby dużo pamięci w większych systemach) lub w DB? Jaka jest najlepsza praktyka?
jgauffin
1
Podczas odtwarzania agregacji w celu wykonania danego polecenia zdarzenia zostaną odtworzone, a agregacja zostanie zachowana w pamięci, wykonaj akcję, wygeneruj zdarzenia, a następnie zapisz zdarzenia w magazynie zdarzeń. Ale tak, agregat z jego obiektami wartości i bytami byłby przechowywany w pamięci. Nie ma potrzeby przechowywania ich w innej bazie danych. Zwykle i tak byłby to krótki okres do zakończenia polecenia. Jeśli masz polecenia obejmujące wiele agregatów, które są nieco inne, może to równie dobrze zasygnalizować pewne problemy projektowe z ograniczonymi kontekstami.
Vadim,
9

W przypadku Event Sourcing głównym pytaniem jest „jaka jest twoja książka rekordów”.

Jeśli twoja księga rekordów jest Twoim strumieniem wydarzeń, nie będziesz mieć problemów. Jeśli twoja księga rekordów jest twoim „modelem bytu”, problemy zaczną się dziać wszędzie. Częścią tego jest to, że możesz powiedzieć „jeśli zgubiłem mój model bytu, czy mógłbym go odbudować ze strumienia zdarzeń”. Jeśli masz pozytywną odpowiedź na to pytanie, Twój dziennik zdarzeń jest Twoją książką.

Należy również pamiętać, że większość osób korzystających z pozyskiwania zdarzeń korzysta z modelu odczytu. Ten model służy do tworzenia zapytań o dane. Jest to jednak bardziej prawdopodobne, że będzie wyglądać jak model 1nf niż model encji 3nf. Odtwarzają tylko zdarzenia, aby przywrócić stany agregatów i ustalić, czy zapisy powinny być dozwolone.

Greg Young
źródło
Cześć Greg, jestem nowy w pozyskiwaniu wydarzeń, ale naprawdę chcę to opanować, czy możesz zasugerować zasoby dla praktycznych przykładów i wyjaśnień, oglądałem i czytałem dużo o CQRS, ES, ale kiedy chcę rozpocząć prototyp za pomocą tego naprawdę nie mogę się dowiedzieć, gdzie, kiedy :) Mam nadzieję, że możesz mi coś zasugerować (jestem po stronie Java). Dziękuję za Twój czas.
vach
1

Nadal mogę mieć DB ze wszystkimi podmiotami, prawda? A może zdarzenia powinny być odtwarzane przy każdym uruchomieniu aplikacji, aby uzyskać najnowszą wersję każdego elementu w pamięci?

Odpowiedź zależy od wymagań aplikacji. Widziałem, jak robi się to na dwa sposoby.

Jeden niezwykle udany pakiet oprogramowania dla małych firm księgowych odczytuje dziennik CQRS przy każdym uruchomieniu. Surowa ilość danych była stosunkowo niewielka, więc czas uruchamiania był krótszy niż minuta, nawet na wolniejszych komputerach. Robili CQRS od ponad dekady, zanim praktyka stała się popularna. Wiedzieli, że wpadli na coś dobrego, kiedy zdali sobie sprawę, że mogą ciągle aktualizować dane swoich klientów bez problemów z większymi systemami.

W systemach z większymi ilościami danych i / lub systemach opartych na funkcjonalności RDBMS do implementacji strony zapytania masz bazę danych dla „bieżącego widoku” danych pochodzących ze zdarzeń (możesz mieć nawet wiele takich widoków). Zaletą tego podejścia jest to, że pozwala budować stronę zapytania przy użyciu znanych technologii.

dasblinkenlight
źródło
Który pakiet księgowy to robi?
magnus
@ user1420752 Axys .
dasblinkenlight