My Authors
Read all threads
@mzagozda Dziękuję bardzo! Cieszę się, że się podobało 🤩 Bardzo dobre pytanie.
Zacznijmy od tego, że sam Event Sourcing jest wzorcem, który co prawda o tym mówi, jak przechowywać dane, a w zasadzie nie tyle jak co w jakiej formie - konkretnie zdarzeń. Jednak sam w sobie nie mówi gdzie 1/
@mzagozda Zatem moglibyśmy przechowywać te zdarzenia równie dobrze w pliku tekstowym, binarnym, excelu, xmlu, json, czy też już bardziej rzeczywiście w bazie danych. No i tutaj w zależności od tego jaka jest charakterystyka naszego miejsca przechowywania takie mamy też możliwości 2/
@mzagozda Jeżeli korzystamy z jakiegoś rozproszonej bazy danych to może to być faktycznie utrudnione. Większość z nich ma możliwość tylko "symulowania" takiej weryfikacji (np. DynamoDB aws.amazon.com/blogs/database…). Zwykle jest to przy symulowane poprzez algorytmy rozwiązywania konfliktów /3
@mzagozda Przykładem może być np. 2-Phase commit (martin.kleppmann.com/2016/03/07/qco…). Zwykle najprostszą unikalności w strumieniach zdarzeń jest nadanie klucza strumienia (czyli naszego rekordu) tak aby zawierał w sobie wartość, którą chcemy mieć unikalność /4
@mzagozda Np. jeśli mamy fakturę, która musi mieć unikalny numer, albo użytkownika, który ma mieć unikalny email to wziąć jako klucze odpowiednio numer faktury i email. Zarówno systemy rozproszone jak i relacyjne potrafią zachowywać unikalność swoich kluczy /5
@mzagozda No i wracając do Event Sourcing, @marten_lib i baz relacyjnych. Jeśli używamy do przechowywania bazę (np. @postgresql) relacyjną to ułatwiamy sobie zachowanie unikalności. Marten potrafi zarówno obsłużyć wspomiane już klucze stringowe (nie tylko guid): martendb.io/documentation/… /6
@mzagozda @marten_lib @PostgreSQL Sama tabela eventów nie wspiera nakładania na niej kluczy dodatkowych (poza domyślnymi) out of the box - spowolniłoby to dodawanie. Możemy jednak powiedzieć Marten, żeby robił Snapshot ostatniego (najświeższego stanu agregatu). Taki snapshot będzie zapisany jako dokument /7
@mzagozda @marten_lib @PostgreSQL Na takim dokumencie możemy zakładać już dowolne indeksy, klucze itd. W tym właśnie unikalne: martendb.io/documentation/…. Dzięki temu jak wykonamy operację biznesową to w trakcie zapisu zdarzenia zostanie też zapisany stan agregatu i na nim zostanie sprawdzona unikalność /8
@mzagozda @marten_lib @PostgreSQL W przykładach, których prezentowałem można znaleźć to dla takiej reguły: siedzenie może mieć maksymalnie jedną aktywną (nieanulowaną) transakcję. Aby tego dokonać wystarczy kazać Marten robić snapshot github.com/oskardudycz/Ev… oraz... /9
@mzagozda @marten_lib @PostgreSQL ...oraz ustawić regułę unikalności na nim github.com/oskardudycz/Ev… I to tyle - reszta już się będzie działa pod spodem. Czy to jest odpowiedź na Twoje pytanie? 😅 Trochę się rozpisałem, także szacun jak dotrwałeś do tego momentu @mzagozda
10/10
Missing some Tweet in this thread? You can try to force a refresh.

Enjoying this thread?

Keep Current with Oskar at .Net

Profile picture

Stay in touch and get notified when new unrolls are available from this author!

Read all threads

This Thread may be Removed Anytime!

Twitter may remove this content at anytime, convert it as a PDF, save and print for later use!

Try unrolling a thread yourself!

how to unroll video

1) Follow Thread Reader App on Twitter so you can easily mention us!

2) Go to a Twitter thread (series of Tweets by the same owner) and mention us with a keyword "unroll" @threadreaderapp unroll

You can practice here first or read more on our help page!

Follow Us on Twitter!

Did Thread Reader help you today?

Support us! We are indie developers!


This site is made by just two indie developers on a laptop doing marketing, support and development! Read more about the story.

Become a Premium Member ($3.00/month or $30.00/year) and get exclusive features!

Become Premium

Too expensive? Make a small donation by buying us coffee ($5) or help with server cost ($10)

Donate via Paypal Become our Patreon

Thank you for your support!