Co to jest event sourcing?

Definicja Event Sourcingu

Event Sourcing (pozyskiwanie zdarzeń) to wzorzec architektoniczny i sposób zarządzania stanem aplikacji, w którym wszystkie zmiany stanu agregatu (obiektu domenowego, np. zamówienia, konta użytkownika) są zapisywane jako sekwencja niezmiennych (immutable) zdarzeń w porządku chronologicznym. Zamiast przechowywać tylko aktualny stan obiektu, jak w tradycyjnych bazach danych, przechowuje się całą historię zdarzeń, które doprowadziły do tego stanu.

Aktualny stan agregatu można w dowolnym momencie odtworzyć (zrekonstruować), odtwarzając sekwencję zdarzeń od początku. Ta fundamentalna różnica w stosunku do konwencjonalnego podejścia CRUD (Create, Read, Update, Delete) otwiera zupełnie nowe możliwości w zakresie audytu, analizy i projektowania systemów.

Jak działa Event Sourcing?

W systemie opartym na Event Sourcingu przepływ danych przebiega według jasno zdefiniowanego procesu:

Polecenia i walidacja

Przychodzące polecenia (Commands), czyli intencje zmiany stanu, są walidowane przez agregat. Agregat sprawdza, czy polecenie jest dozwolone w aktualnym stanie i czy wszystkie reguły biznesowe są spełnione. Tylko poprawne polecenia skutkują wygenerowaniem zdarzeń.

Generowanie zdarzeń

Jeśli polecenie jest poprawne, agregat generuje jedno lub więcej zdarzeń domenowych opisujących fakt, że zmiana stanu nastąpiła. Przykłady obejmują:

  • ZamowienieZlozone (OrderPlaced)
  • AdresDostawyZmieniony (DeliveryAddressChanged)
  • ProduktDodanyDoKoszyka (ProductAddedToCart)
  • PlatnoscPotwierdzona (PaymentConfirmed)
  • ZamowienieAnulowane (OrderCancelled)

Zdarzenia są faktami z przeszłości i są niezmienne. Opisują to, co się wydarzyło, a nie to, co powinno się wydarzyć. To rozróżnienie jest fundamentalne dla prawidłowego zrozumienia Event Sourcingu.

Magazyn zdarzeń (Event Store)

Wygenerowane zdarzenia są zapisywane w specjalnym magazynie zdarzeń (Event Store) w kolejności ich wystąpienia. Event Store działa jak append-only log (dziennik tylko do dopisywania), w którym nowe wpisy są dodawane, ale istniejące nigdy nie są modyfikowane ani usuwane. Każde zdarzenie jest zazwyczaj przechowywane z metadanymi obejmującymi znacznik czasu, identyfikator agregatu, typ zdarzenia, numer sekwencyjny i ładunek zdarzenia.

Odtwarzanie stanu (Replay)

Agregat aktualizuje swój wewnętrzny stan, aplikując logikę zawarta w obsłudze każdego zdarzenia. Aby uzyskać aktualny stan agregatu (np. przy obsłudze kolejnego polecenia), system odczytuje wszystkie zdarzenia dotyczące tego agregatu z Event Store i odtwarza je po kolei, aplikując zmiany stanu sekwencyjnie.

Migawki (Snapshots) do optymalizacji

W przypadku agregatów z długą historią zdarzeń odtwarzanie może stać się czasochłonne. Migawki okresowo zapisują pełny stan agregatu, dzięki czemu replay musi zacząć się dopiero od ostatniej migawki. Optymalna częstotliwość tworzenia migawek zależy od liczby zdarzeń i oczekiwanego czasu ładowania. Popularne strategie obejmują tworzenie migawek co N zdarzeń lub w oparciu o odstępy czasowe.

Publikacja zdarzeń

Zapisane zdarzenia mogą być publikowane do innych części systemu, na przykład poprzez brokera wiadomości. Pozwala to innym komponentom reagować na zdarzenia i aktualizować własne modele odczytu, stanowiąc podstawę integracji z CQRS i komunikacji miedzyserwisowej.

Event Sourcing i CQRS

Event Sourcing jest często stosowany w połączeniu z wzorcem CQRS (Command Query Responsibility Segregation). CQRS rozdziela model zapisu (Commands) od modelu odczytu (Queries):

AspektStrona zapisuStrona odczytu
Model danychEvent Store z sekwencjami zdarzeńZoptymalizowane modele odczytu (projekcje)
OptymalizacjaWalidacja i spójnośćWydajność zapytań
SkalowanieZoptymalizowane dla obciążenia zapisuZoptymalizowane dla obciążenia odczytu
AktualizacjaPrzez przetwarzanie komendPrzez projekcje zdarzeń

Ta kombinacja umożliwia tworzenie różnych modeli odczytu dla różnych wymagań bez wpływu na model zapisu. System e-commerce może mieć oddzielne projekcje dla statusu zamówień, raportów przychodu i przeglądów stanów magazynowych, wszystkie zasilane z tego samego strumienia zdarzeń.

Korzyści z Event Sourcingu

Stosowanie wzorca Event Sourcing przynosi szereg znaczących korzyści:

  • Pełna historia zmian (Audit Log): Przechowywanie pełnej historii zdarzeń stanowi naturalny dziennik audytowy, pozwalający dokładnie prześledzić, jak stan agregatu zmieniał się w czasie i dlaczego. Jest to nieocenione dla zgodności regulacyjnej, wymagań prawnych i rozwiązywania sporów.
  • Możliwość odtwarzania stanu z przeszłości: Łatwo jest odtworzyć stan systemu z dowolnego punktu w przeszłości, co jest przydatne do debugowania, analizy, wymagań compliance i testowania.
  • Elastyczność w tworzeniu modeli odczytu: Zapisane zdarzenia mogą być wykorzystane do budowania wielu różnych modeli odczytu (projekcji), zoptymalizowanych pod kątem różnych potrzeb analitycznych czy widoków w aplikacji, bez wpływu na model zapisu.
  • Wysoka wydajność zapisu: Zapisywanie zdarzeń do append-only logu jest zazwyczaj bardzo szybką operacją, ponieważ nie są wymagane blokady na istniejących rekordach.
  • Naturalne wsparcie dla EDA: Event Sourcing doskonale komponuje się z architekturą zorientowaną na zdarzenia, gdzie zdarzenia są podstawowym mechanizmem komunikacji.
  • Ułatwione debugowanie: Pełna historia zdarzeń ułatwia zrozumienie, co doprowadziło do błędnego stanu, i umożliwia celowe odtworzenie problemów.
  • Zapytania temporalne: Zapytania mogą być wykonywane wobec stanu systemu z dowolnego momentu w czasie, co jest nieocenione dla compliance i analizy.

Wyzwania i złożoność

Implementacja Event Sourcingu wiąże się również z pewnymi wyzwaniami:

Złożoność koncepcyjna

Event Sourcing jest bardziej złożonym wzorcem niż tradycyjne podejście CRUD. Cały zespół deweloperski musi zrozumieć i konsekwentnie stosować tę koncepcję. Zmiana paradygmatu z myślenia w stanach na myślenie w zdarzeniach wymaga przyzwyczajenia i szkolenia.

Wydajność odtwarzania stanu

Odtwarzanie stanu z długiej historii zdarzeń może być czasochłonne. Bez migawek czas ładowania rośnie liniowo wraz z liczbą zdarzeń. Przemyślana strategia tworzenia migawek jest zatem kluczowa dla wydajności.

Wersjonowanie zdarzeń

W miarę ewolucji systemu struktura zdarzeń może się zmieniać. Implementacja mechanizmów obsługi różnych wersji zdarzeń (event schema versioning) jest jednym z największych praktycznych wyzwań. Popularne strategie obejmują upcasting (transformacja starych zdarzeń podczas odczytu) oraz wykorzystanie schema registries.

Zarządzanie Event Store

Magazyn zdarzeń staje się kluczowym elementem systemu i wymaga odpowiedniego zarządzania, skalowania i tworzenia kopii zapasowych. Wybór odpowiedniej technologii — czy to specjalizowanych rozwiązań jak EventStoreDB, czy generycznych systemów jak Apache Kafka — zależy od specyficznych wymagań.

Spójność ostateczna (Eventual Consistency)

W systemach rozproszonych, gdzie zdarzenia są propagowane asynchronicznie, modele odczytu mogą być aktualizowane z pewnym opóźnieniem. Ta eventual consistency musi być uwzględniona w interfejsie użytkownika i procesach biznesowych.

Usuwanie danych i ochrona prywatności

Ponieważ zdarzenia są niezmienne, usuwanie danych wymagane przez regulacje takie jak RODO stanowi szczególne wyzwanie. Podejścia rozwiązujące ten problem obejmują crypto-shredding (szyfrowanie danych osobowych i usuwanie klucza) oraz transformacje zdarzeń.

Technologie implementacyjne

Do implementacji Event Sourcingu dostępnych jest kilka technologii:

  • EventStoreDB: Baza danych zaprojektowana specjalnie dla Event Sourcingu z wbudowanym wsparciem dla strumieni, projekcji i subskrypcji.
  • Apache Kafka: Jako rozproszony commit log, Kafka doskonale nadaje się jako event store dla scenariuszy o dużym wolumenie.
  • Axon Framework: Framework Java wspierający Event Sourcing i CQRS out of the box.
  • Marten: Biblioteka .NET wykorzystująca PostgreSQL jako event store.
  • Relacyjne bazy danych: Z odpowiednim projektem schematu, PostgreSQL lub inne relacyjne bazy danych mogą również służyć jako event store dla prostszych przypadków użycia.

Kiedy stosować Event Sourcing?

Event Sourcing jest szczególnie wartościowy w systemach, gdzie:

  • Kluczowe jest posiadanie pełnej historii zmian stanu (audyt, compliance).
  • Istnieje potrzeba odtwarzania stanu z przeszłości do celów debugowania lub analizy.
  • Wymagana jest duża elastyczność w tworzeniu różnych widoków danych (modeli odczytu).
  • Architektura systemu opiera się na zdarzeniach (EDA).
  • Mamy do czynienia ze złożoną logiką biznesową i potrzebą analizy przyczynowo-skutkowej.
  • Obowiązują branżowe wymogi compliance (finanse, ochrona zdrowia, regulacje).

Dla prostych aplikacji CRUD bez szczególnych wymagań audytowych lub analitycznych Event Sourcing jest często nadmiarowy i dodaje niepotrzebną złożoność. Zespoły powinny starannie ocenić, czy korzyści uzasadniają dodatkową inwestycję architektoniczną.

Event Sourcing a potrzeby kadrowe

ARDURA Consulting wspiera organizacje w pozyskiwaniu architektów oprogramowania i deweloperów backendowych z dogłębnym doświadczeniem w Event Sourcing i CQRS. Implementacja tych zaawansowanych wzorców architektonicznych wymaga wyspecjalizowanej wiedzy, która jest bardzo poszukiwana na rynku pracy. Dzięki doświadczonym specjalistom firmy mogą wykorzystać zalety Event Sourcingu, jednocześnie skutecznie radząc sobie z powyższymi wyzwaniami i unikając typowych pułapek podczas wdrażania.

Podsumowanie

Event Sourcing to potężny wzorzec architektoniczny, który zmienia sposób myślenia o zarządzaniu stanem aplikacji, koncentrując się na zapisywaniu historii zdarzeń, a nie tylko aktualnego stanu. Oferuje unikalne korzyści w zakresie audytu, elastyczności, debugowania i analizy, ale wprowadza również dodatkową złożoność, szczególnie w obszarze wersjonowania zdarzeń, spójności danych i ochrony danych osobowych. W połączeniu z CQRS i architekturą zorientowaną na zdarzenia Event Sourcing osiąga pełnię swojego potencjału, umożliwiając budowę robustnych, skalowalnych i przejrzystych systemów dla wymagających zastosowań biznesowych. Organizacje adoptujące ten wzorzec powinny inwestować w edukację zespołu i wybór odpowiednich narzędzi, aby odnieść sukces w procesie implementacji.

Najczęściej zadawane pytania

Czym jest Event Sourcing?

Event Sourcing (pozyskiwanie zdarzeń) to wzorzec architektoniczny i sposób zarządzania stanem aplikacji, w którym wszystkie zmiany stanu agregatu (obiektu domenowego, np. zamówienia, konta użytkownika) są zapisywane jako sekwencja niezmiennych (immutable) zdarzeń w porządku chronologicznym.

Jak działa Event Sourcing?

W systemie opartym na Event Sourcingu przepływ danych przebiega według jasno zdefiniowanego procesu: Przychodzące polecenia (Commands), czyli intencje zmiany stanu, są walidowane przez agregat.

Jakie są korzyści ze stosowania Event Sourcingu?

Stosowanie wzorca Event Sourcing przynosi szereg znaczących korzyści, z których najważniejszą jest pełna historia zmian. Przechowywanie wszystkich zdarzeń stanowi naturalny dziennik audytowy (audit log), pozwalający dokładnie prześledzić, jak i dlaczego stan agregatu zmieniał się w czasie.

Jakie są wyzwania związane z wdrożeniem Event Sourcingu?

Implementacja Event Sourcingu wiąże się również z pewnymi wyzwaniami. Przede wszystkim jest to wzorzec bardziej złożony niż tradycyjne podejście CRUD, dlatego cały zespół deweloperski musi zrozumieć tę koncepcję i konsekwentnie ją stosować.

Jakie narzędzia są używane do implementacji Event Sourcingu?

Do implementacji Event Sourcingu dostępnych jest kilka technologii. Jedną z nich jest EventStoreDB, baza danych zaprojektowana specjalnie dla Event Sourcingu, z wbudowanym wsparciem dla strumieni, projekcji i subskrypcji.

Architekturę opartą na event sourcingu i CQRS, z pełną historią zmian każdego agregatu, zaprojektuje i wdroży z Tobą nasz zespół Software Development.

Umow darmowa konsultacje →
Uzyskaj wycenę
Umow konsultacje