UX Research i badania

Jak event-sourcing zmienia podejście do projektowania aplikacji

W dzisiejszych czasach coraz więcej projektów wymaga skalowalności i odporności na awarie. Event-sourcing to podejście, które pozwala na tworzenie systemów, które są niezwykle elastyczne i wytrzymałe na błędy. W tym artykule dowiesz się, jak event-sourcing wpływa na projektowanie aplikacji.

19 cze 2023

Event-sourcing to podejście do projektowania aplikacji, które wykorzystuje zdarzenia jako główne źródło informacji oraz przechowuje je w postaci sekwencji. Każde zdarzenie reprezentuje zmianę w stanie aplikacji i jest traktowane jako nieodwracalne. To podejście zapewnia wiarygodne śledzenie historii działania aplikacji oraz umożliwia łatwe przywracanie do dowolnego punktu w czasie.

 

Strumień zdarzeń jako podstawa pracy aplikacji

Event-sourcing to podejście do projektowania aplikacji, w którym dane są przechowywane w formie strumieni zdarzeń, czyli kolekcji niezmienialnych zapisów dotyczących wszystkich operacji na danych. Taki strumień stanowi główną bazę danych dla aplikacji, a każde nowe zdarzenie jest dopisywane na końcu strumienia. Dzięki temu każda zmiana danych jest reprezentowana jako nowe zdarzenie, a dostęp do historii danych pozwala na łatwe analizowanie i wyciąganie wniosków. Przy projektowaniu aplikacji korzystającej z event-sourcingu ważne jest odpowiednie zaprojektowanie strumienia zdarzeń, który będzie spełniał wymagania biznesowe i umożliwiał łatwe odwzorowanie stanu aplikacji.

BoringOwl_programming_female_developer_in_front_of_a_computer_i_ce315510-9351-41ad-a433-4886278765c6 (1).png

Odrzucenie tradycyjnej struktury bazy danych

Jedną z kluczowych kwestii, która wynika z podejścia event-sourcing, jest konieczność odrzucenia tradycyjnej struktury bazy danych. Zamiast przechowywać ostatni stan obiektu, jak ma to miejsce w podejściu CRUD, event-sourcing wymaga przechowywania historii wszystkich zmian, które zostały wprowadzone. Oznacza to, że każde zdarzenie jest zapisywane oddzielnie, a baza danych zamiast struktury tabelarycznej składa się z zapisanych zdarzeń.

 

Histereza - dlaczego czasami zdarzenia mogą być odpowiedzią na zapytania

W podejściu tradycyjnym do projektowania aplikacji często zapytania kierowane są do bazy danych w celu pobrania aktualnego stanu encji. Jednak zastosowanie architektury opartej o event-sourcing pozwala na przejście do modelu, w którym przechowywane są jedynie zdarzenia, a stan encji jest odtwarzany na bieżąco na podstawie historii tych zdarzeń. W takim podejściu występuje zjawisko histerezy, czyli opóźnienia między wykonaniem zdarzenia a jego wpływem na stan encji. W rezultacie zapytania kierowane są do bazy z wyprzedzeniem, by w momencie ich wykonania otrzymać aktualną wartość encji. Zdarzenia stają się w tym przypadku odpowiedzią na zapytania, dzięki czemu również zapytania z ostatniej chwili są w stanie uzyskać poprawną odpowiedź.

 

Nieodwracalność zdarzeń – jak wpływa na modelowanie domeny?

W tradycyjnych systemach CRUD operacje na danych mogą być odwracalne – rekordy można aktualizować i usuwać, co prowadzi do utraty wcześniejszych wartości. W podejściu event sourcingu każde zdarzenie jest nieodwracalne i zapisywane jako część historii systemu. Oznacza to, że stan aplikacji nie jest zmieniany bezpośrednio, a jedynie rekonstruowany na podstawie kolejnych zdarzeń.

Taka nieodwracalność zmusza do innego modelowania domeny – zamiast myśleć o modyfikacji obiektów, projektujemy system w oparciu o zdarzenia, które opisują fakty zaistniałe w aplikacji. Zmienia to perspektywę, czyniąc system bardziej odpornym na błędy i umożliwiając łatwiejsze audytowanie operacji. W efekcie mamy pełną historię zmian, co jest szczególnie przydatne w systemach finansowych, medycznych czy wszędzie tam, gdzie kluczowa jest transparentność danych.

 

Eventual consistency – czy spójność w czasie rzeczywistym jest konieczna?

W systemach opartych na event sourcingu spójność danych nie jest gwarantowana natychmiastowo. Zamiast tego stosuje się model eventual consistency, w którym różne części systemu mogą mieć chwilowo różne stany, ale w końcu osiągną spójność.

W wielu przypadkach taka asynchroniczność nie jest problemem – np. w systemach e-commerce użytkownik może od razu zobaczyć komunikat „Twoje zamówienie zostało złożone”, podczas gdy faktyczne przetwarzanie płatności i rezerwacja produktów w magazynie dzieje się w tle. Podejście to pozwala na lepsze skalowanie systemu, eliminację blokad baz danych i większą odporność na awarie.

Jednak nie zawsze eventual consistency jest akceptowalna – np. w systemach bankowych kluczowe jest, aby saldo konta było spójne natychmiast po wykonaniu przelewu. Dlatego w zależności od wymagań biznesowych event sourcing może być uzupełniany mechanizmami zapewniającymi silniejszą spójność dla krytycznych operacji.

 

Event Sourcing a CQRS – naturalne połączenie czy osobne podejścia?

CQRS (Command Query Responsibility Segregation) i event sourcing często idą w parze, ale nie są tym samym. CQRS zakłada oddzielenie operacji modyfikujących stan systemu (komendy) od operacji odczytu (zapytania). W klasycznym modelu CRUD te operacje często są realizowane na tych samych strukturach danych, co może prowadzić do problemów wydajnościowych i złożonych zależności.

Event sourcing naturalnie wspiera CQRS, ponieważ zamiast modyfikować rekordy, zapisuje zdarzenia, które mogą być później interpretowane w różny sposób w zależności od potrzeb. Dane do odczytu mogą być przetwarzane asynchronicznie i materializowane w zoptymalizowanych widokach (tzw. read models), co zwiększa wydajność systemu.

Mimo że CQRS i event sourcing często są stosowane razem, można je również rozdzielić. CQRS może funkcjonować bez event sourcingu, korzystając z klasycznych baz danych, a event sourcing może działać w systemie bez CQRS, gdzie odczyt bazuje na pełnej rekonstrukcji stanu. Wybór odpowiedniej kombinacji zależy od wymagań systemu i jego architektury.

 

Różnice między projektowaniem aplikacji opartych o zdarzenia a tradycyjnym podejściem

W podejściu tradycyjnym projektujemy aplikację jako system, który reaguje na wejściowe akcje użytkownika, tworząc nowy stan aplikacji. Zdarzenie jest jedynie reakcją na poprzednie akcje. W przeciwieństwie do tego, w podejściu opartym o zdarzenia, wszystko co dzieje się w aplikacji jest zdarzeniem. Zamiast tworzyć nowy stan aplikacji, dodajemy kolejne zdarzenia. Dzięki temu możemy łatwo przeglądać historię zmian i odtwarzać stan aplikacji w dowolnym momencie.

FAQ

Najczęstsze pytania

  • To podejście do projektowania aplikacji wykorzystujące zdarzenia jako główne źródło informacji, przechowywane w postaci sekwencji. Każde zdarzenie reprezentuje zmianę w stanie aplikacji i jest traktowane jako nieodwracalne, co zapewnia wiarygodne śledzenie historii działania aplikacji i umożliwia przywracanie do dowolnego punktu w czasie.
  • Zamiast przechowywać ostatni stan obiektu, event-sourcing wymaga przechowywania historii wszystkich zmian — każde zdarzenie zapisywane jest oddzielnie, a baza danych składa się z zapisanych zdarzeń zamiast struktury tabelarycznej. Stan aplikacji nie jest zmieniany bezpośrednio, lecz rekonstruowany na podstawie kolejnych zdarzeń.
  • Zamiast myśleć o modyfikacji obiektów, projektuje się system w oparciu o zdarzenia opisujące fakty zaistniałe w aplikacji. Czyni to system bardziej odpornym na błędy i umożliwia łatwiejsze audytowanie operacji — pełna historia zmian jest szczególnie przydatna w systemach finansowych czy medycznych, gdzie kluczowa jest transparentność danych.
  • To model, w którym różne części systemu mogą mieć chwilowo różne stany, ale w końcu osiągną spójność. W e-commerce użytkownik od razu widzi komunikat o złożeniu zamówienia, a przetwarzanie płatności dzieje się w tle. Pozwala to lepiej skalować system, ale nie zawsze jest akceptowalne — np. w bankowości saldo musi być spójne natychmiast po przelewie.
  • CQRS (Command Query Responsibility Segregation) zakłada oddzielenie operacji modyfikujących stan (komendy) od operacji odczytu (zapytania). Event-sourcing naturalnie wspiera CQRS — zamiast modyfikować rekordy, zapisuje zdarzenia interpretowane w różny sposób, a dane do odczytu mogą być materializowane w zoptymalizowanych widokach (read models). Można je jednak stosować osobno.

Blog

Powiązane artykuły

Czytaj więcej
UX Research i badania

CSS Houdini: Custom Properties, Paint API i przyszłość stylowania

Nowoczesne interfejsy webowe coraz częściej wykraczają poza możliwości klasycznego CSS. Deweloperzy przez lata byli zmuszeni sięgać po JavaScript, SVG lub Canvas, aby tworzyć niestandardowe efekty wizualne i dynamiczne style. CSS Houdini zmienia ten paradygmat, otwierając wewnętrzny mechanizm renderowania przeglądarki na rozszerzenia tworzone przez programistów.

Tomasz Kozon
05 gru 2025
UX Research i badania

CSS Nesting: Jak uporządkować swoje style w nowoczesny sposób

CSS od lat stanowi fundament stylizacji stron internetowych, ale wraz ze wzrostem złożoności projektów pojawia się problem utrzymania czytelnych i uporządkowanych styli. Programiści często borykają się z powtarzalnymi selektorami, chaosem w arkuszach i trudnościami w skalowaniu kodu. Nowe rozwiązanie – CSS Nesting – pozwala pisać reguły w bardziej naturalny i logiczny sposób, zbliżony do struktury HTML.

Tomasz Kozon
31 sie 2025
UX Research i badania

Design-to-Code: co to jest i jak działa?

Design-to-Code to podejście, które skraca drogę od projektu w Figmie do działającego interfejsu w aplikacji, coraz częściej wspieranego przez AI. Zamiast ręcznie przepisywać layout, style i komponenty, część decyzji projektowych można automatycznie przenieść do kodu i szybciej zbudować pierwszą wersję UI. To nie magia, tylko zestaw konkretnych technik i narzędzi, które najlepiej działają wtedy, gdy projekt jest uporządkowany i oparty na design systemie.

Tomasz Kozon
22 lut 2026
UX Research i badania

Micro-Delays w UX: celowo projektowane mikroopóźnienia

W świecie projektowania UX szybkość działania interfejsu od lat uznawana jest za jeden z kluczowych wyznaczników jakości. Paradoksalnie jednak nie wszystkie opóźnienia są błędem - niektóre z nich są celowo projektowane, by wspierać zrozumienie, poczucie kontroli i zaufanie użytkownika. Micro-delays, czyli krótkie, kontrolowane mikroopóźnienia, mogą sprawić, że interakcje staną się bardziej naturalne i przewidywalne.

Tomasz Kozon
18 gru 2025