dla Architektów Oprogramowania
2 godz. 1 min · Full-stack i Programowanie
Rafał PiekaraSoftware KomandosZanurzymy się w definiowanie strategicznych wzorców Domain Driven Design, które stanowią fundament efektywnego zrozumienia problemów biznesowych. Omówimy kluczowe koncepty takie jak Subdomena czy Bounded Context.
Wzorce taktyczne to praktyczne aspekty DDD, które są kluczowe dla każdego architekta oprogramowania. W tej sekcji mocniej spojrzymy na kod. Dowiesz się, jak stosować i testować wzorce takie jak Value Object, Encja czy Agregat.
Bazy danych to serce wielu systemów, a ich prawidłowe użycie w kontekście DDD jest kluczowe. Omówimy najlepsze praktyki związane z integracją domeny i kontekstów z tabelami bazodanowymi. Poznasz techniki, które pozwolą Ci zachować integralność danych i spójność modelu domenowego, niezależnie od wybranej technologii bazodanowej.
Teoria jest ważna, ale praktyka czyni mistrza. Przejdziemy przez konkretne przykłady implementacji DDD w rzeczywistych projektach. Zobaczysz krok po kroku zastosowanie wzorców, zamodelowanie domeny i implementację. Praktyczne przykłady pomogą Ci zrozumieć, jak stosować DDD w codziennej pracy i jak wpływa to na komunikację z interesariuszami biznesowymi.
Każdy architekt oprogramowania spotkał się z systemami, które były nieczytelne i trudne do utrzymania - tak zwanymi "Big Ball of Mud". Nauczysz się, jak za pomocą DDD przeprowadzić refaktoryzację takiego systemu, przekształcając go w dobrze zorganizowane i zarządzalne struktury.
Kurs powstał z myślą o programistach aspirujących do roli architektów, architektach oprogramowania oraz liderach technicznych, którzy chcą pogłębić swoją wiedzę i umiejętności w zakresie stosowania Domain Driven Design. To materiał idealny dla tych, którzy znają już podstawy DDD i chcą podnieść swoje umiejętności na wyższy poziom, aby projektować złożone i skalowalne systemy. Niezależnie od tego, czy pracujesz nad dużymi projektami, chcesz usprawnić komunikację z zespołem i interesariuszami, czy szukasz nowych strategii na rozwiązywanie skomplikowanych problemów biznesowych - ten kurs jest dla Ciebie!
Porozmawiajmy teraz o bazach danych.
Baza danych i praca z bazami danych w Domain Service Design
to nierzadko wielkie wyzwanie.
Bo jeśli operujemy na wielu kontekstach, konieczne jest jakiś sposób izolacji
warstw danych pomiędzy naszymi kontekstami.
I z pomocą przychodzą tutaj różne techniki, które zostały już zdefiniowane
po to, żeby ta praca z bazą danych przebiegała bez problemowo.
Na początek musimy pamiętać o tym, że.
każdy Context zarządza jakimś swoim pakietem danych
i pierwszym najprostszym sposobem, który nam przychodzi do głowy jest po prostu
stworzenie oddzielnych baz danych dla każdego kontekstu, gdzie każdy kontekst
zapisuje i czyta tylko do swojej d izolowanej bazy danych, przez co mamy
zapewnioną izolację i niezależność pomiędzy danymi poszczególnych kontekstów.
Drugą techniką jest tworzenie różnego rodzaju skim schematów w jednej bazie
danych, z czym szczególnie dobrze radzi sobie PostgreSQL.
Takie oddzielne schematy dla każdego kontekstu współistnieją w jednej bazie i
konteksty wiedzą, z którego schematu należy korzystać.
Dla administratorów czy inżynierów ułatwia to zarządzanie, ale z drugiej strony
wymaga dużej dyscypliny w izolacji, bo utrzymywanie różnych skal w jednej bazie
danych jest czasami problematyczne, zwłaszcza w bardzo dużym systemie.
Możemy także korzystać z widoków takich zwykłych oldskulowe tych SQL owych
widoków, które wykorzystujemy do odczytu danych między
kontekstami bez naruszania granic.
Mamy kilka kontekstów.
Przez to, żeby zapewnić tym kontekstem izolację, żeby
one nie musiały odpytywać się wzajemnie.
Stosujemy widoki i różne konteksty.
Mają swoje zdefiniowane widoki.
One są utrzymywane często na poziomie kodu, zdefiniowane w kodzie aplikacji I
te konteksty z tych widoków korzystają i czytają dane, przez co mamy
zapewnioną konsystencję, izolację.
Możemy także pokusić się o pracę z eventami Domain Driven Design.
Bardzo mocny. Nacisk.
Kładzie na to, żebyśmy pracowali z eventami i tutaj możemy mieć
zastosowaną technikę, event konsystencji z eventami, gdzie będziemy synchronizować
sobie dane pomiędzy kontekstami za pomocą opublikowanych zdarzeń domenowych.
Uzyskamy tutaj pewną asynchronicznie, ale też i odporność na błędy.
Możemy też stosować table prefix link Co to jest table fixing albo dodawanie sobie
prefiksu charakterystycznego dla kontekstu do nazwy tabeli.
Więc mamy jedną tabelę, jedną z kimś, ale dodajemy sobie prefiksy, czyli np.
będziemy mieć customers, możemy mieć Everything Customers, możemy
mieć Order, Ring Customers itd.
Te różne tabele mogą istnieć w bazie danych.
Wiemy, który context odpowiada za którą tabele.
I tutaj musimy bardzo duży nacisk położyć na to, żeby poszczególne konteksty
pilnowały tego, że tylko dany kontekst owner danej tabeli może do niej zapisywać.
Jest to prosta metoda na takie wizualne oddzielenie tabel między sobą.
Jeśli już pracujemy z mikro serwisami, gdzie te bandit konteksty czy subdomeny
będą osobnymi serwisami, będziemy mieć każdy mikro serwis z osobną
bazą, co jest właściwie dobrą praktyką.
Więc mamy tutaj maksymalną izolację, bo są różne serwisy.
No i skalowalność, bo te serwisy będą się mogły.
Skalować. Niezależnie od siebie.
Jeśli już dzielimy w ten sposób tabele czy dzielimy bazy danych.
Pogadajmy chwilę o technikach tworzenia tabel i wydzielania
odpowiedzialności między nimi.
Musimy pamiętać o zasadzie jednej odpowiedzialności, gdzie każda tabela
powinna należeć do jednego kontekstu i być zarządzana przez jeden zespół lub inaczej
zespół odpowiedzialny za ten konkretny kontekst.
Więc jeden kontekst odpowiada za migrację, za scheme tabeli.
Za zapisy. Za odczyty.
Jeden kontekst pilnuje swojej tabeli.
Musimy pilnować też konwencji nazewnictwa, gdzie używanie spójnych konwencji
przedrostków, przyrostka w nazwach tabel będzie pomagało nam w utrzymaniu porządku
i zrozumieniu zależności, a także tego, do kogo ta tabela należy.
Jeśli będziemy mieć jasno oddzielone odpowiedzialności
poszczególnych tabel, oddzielone odpowiedzialności kontekstów,
konieczny będzie publiczny interfejs API dla dostępu do danych danych kontekstu,
więc będziemy odpytywać nie tabele, nie także jakiś inny kontekst.
Nawet w obrębie monolitu Modular Monolitu Monolitu modularny będzie czytał z
różnych tabel, z różnych kontekstów.
Nie będziemy musieli pytając z jednego kontekstu, odczytując drugi kontekst
będziemy musieli odczytać jako publiczne IP, a nie bezpośrednio
wysyłać zapytania do bazy danych.
No i na koniec możemy posłużyć się także Event Source ringiem.
Taki event Source Ring będzie pomagał w tym, że będzie
jedno źródło prawdy w formie zapisanych eventów i będziemy te zmiany w systemie
zapisywać jako serię eventów, przez co poszczególne konteksty mogą sobie
nasłuchiwać na te zdarzenia i synchronizować swój stan między sobą na
podstawie danych publikowanych w zdarzeniach domenowych.