Rozproszone transakcje są jednym z największych wyzwań w architekturze mikroserwisów. Gdy mamy do czynienia z jednym procesem rozproszonym jako kilka transakcji na różnych bazach danych, to już nie jest to samo, co transakcja na jednej bazie danych, gdzie zawsze możemy zrobić rollback. Jak więc podejść do takiej rozproszonej transakcji? Jak sobie poradzić, jeśli coś się wysypie w procesie, który działa na wielu bazach?
Model domenowy vs ORM
Gdy w aplikacji mamy bogatą domenę, często wybieramy opcję zalecaną przez programowanie obiektowe, czyli trzymanie reguł tam, gdzie znajdują się dane. Wtedy powstają tzw. obiekty domenowe, i tu pojawia się kolejny problem: czy powinniśmy w nich używać ORM, a jeśli nie, to jak można to zrobić?
Anemic “Domain” Model vs Rich Domain Model
To, gdzie umieścimy naszą logikę domenową, wpływa na to, jak będzie nam się później rozwijała aplikacja. Dlatego warto znać konsekwencje swoich decyzji, a w tym pomoże znajomość projektowania aplikacji z wykorzystaniem anemic i rich domain model.
Domain-Driven Design Taktyczne
DDD taktyczne to tak naprawdę dobrze robione programowanie obiektowe. Oczywiście, nie trzeba znać DDD, żeby programować dobrze obiektowo, ale znajomość tych terminów ułatwia nam komunikację i upraszcza pracę.
5 często popełnianych błędów w Springu!
Pisząc aplikację, często popełniamy błędy lub tworzymy rozwiązania, które zamykają nam wiele dróg. Odkryj 5 często popełnianych błędów w Springu – sprawdź, czy sam nie popełniasz któregoś z nich!
ArchUnit: Testy architektury
Decydując się na konkretną architekturę, chcemy przestrzegać zależności między warstwami. Najlepiej zautomatyzować sprawdzanie tych reguł, a w tym celu możemy użyć testów architektury.
Cross-Origin Resource Sharing (CORS)
Nie zawsze chcemy, aby dane z naszego backendu mogły być wczytywane przez dowolny frontend — powinny być dostępne tylko dla frontendu, na który wyraziliśmy zgodę. Do tego właśnie służy mechanizm CORS.
Pessimistic vs. Optimistic Locking
Gdy kilka procesów może jednocześnie modyfikować ten sam zasób, istnieje ryzyko, że jeden UPDATE zostanie pominięty. Dlatego warto się przed tym zabezpieczyć
Testy bez I/O
Mając w aplikacji bogatą logikę biznesową, chcielibyśmy móc testować ją jak najszybciej, niezależnie od innych warstw oraz punktów wejścia i wyjścia naszej aplikacji. Żeby osiągnąć ten cel, może nam pomóc idea portów i adapterów!
Architektura Portów i Adapterów | Heksagonalna
Porty i Adaptery, znane również jako architektura heksagonalna, to podejście, które pozwala na odseparowanie logiki biznesowej od pozostałych warstw w aplikacji. Jest to ogólna idea, która na pewno warto mieć w swoim tool boxie!
Testcontainers: Docker w testach integracyjnych
W testach integracyjnych często musimy zadbać o to, aby nawiązać kontakt z zewnętrznymi usługami, np. z bazą danych. Najlepiej, żeby te usługi były identyczne jak na środowiskach wdrożeniowych, a ich tworzenie w testach było szybkie i zautomatyzowane. W tym celu może nam pomóc Testcontainers!