Microservices Flashcards
Jakie są sposoby komunikacji między mikroserwisami ?
- synchroniczna - REST, gRPC
- asynchroniczna - kolejki, RabbitMQ,, Event driven architecutre
Zalety synchronicznej
- natychmiastowa odpowiedź (klient otrzymuj odpowiedź natychmiast po przetworzeniu przez zerwer)
- łatwość debugowania (łatwiej śledzić przepływ rządań)
Wady synchronicznej
- thight coupling usługi są ściśle powiązane - klienci oczekują dostępności serwera w czasie rzeczywistym
- Single point of Failure - jeśli serwis jest niedostępny, klient czeka lub błąd
- Skalowalność
Zalety asynchronicznej
- Lose coupling serwisy mogą działać niezależnie, nadawca nie musi wiedzieć o dostępności odbiorcy
- odporność na awarie jeśli jeden serwis jest niedostępny wiadmości przetwarzane później
- Skalowalność
- przepustowość obsługa wielu żadań i rozłożenie obciązenia w czasie
Wady asynchronicznej
- złożoność wymagają brokerów
- trudniejsze w debbugowaniu trudniej śledzić asynchroniczny przepływ
- potencjalne opóźnienia
Zalety mikroserwisów
- Luźne powiązanie usługi są w dużej mierze niezależne od siebie
- Autonomia są traktowane jako niezależne komponenty, które łatwo wymieniać
- są stosunkowo proste i skupiają się na jednej funkcjonalnośći
- każdy programista pracuje niezależnie od innych,
- CI/CD mogą być szybciej i częściej wdrażane
- **skalowalność*
Monolit
- jednolitość wszystkie komponenty są ściśle powiązane
- ## budowa -jedno duże oprogramowanie , wszystko w jednej bazie kodu, tylko jedna aplikacja
Monolit vs Mikroserwisy
Monolity:
- trudniej skalowany
- tylko jedna technologia
- jeśli jedna rzecz nie działa to całość nie działa
- nie można pracować na różnymi serwsiami jednocześnie
- wolniejszy development
Wady mikrosewisów
- złożonośc zarządzania
- trudność w transkacjach
- testowanie wymaga testowania interakcji pomiędzy mikroserwisami
- komunikacja pomiędzy serwisami
- monitoring i debbugowanie
- network latency
Działanie architektury mikroserwisowej
Service Discovery and registration
- usługi rejestrują sie do service registry
- umożliwia mikroserwisom znajdowanie się nawzajem w dynamicznym środowisku,
- instancje usług mogą być dodawane lub usuwane.
- mikroserwisy pytają service registry
- rozwiązuje problem tradycyjnego loadbalancera - routing tables
- umożliwa odpowiedni loadbalance pomiędzy instancjami tego samego mikroserwisu
- eureka -> spring cloud load balancer -> Feign Client
API Gateway
- punkt wejścia do systemu, który przekierowuje przychodzące żądania z zewnątrz do odpowiednich mikroserwisów
- Autoryzacja i uwierzytelnianie Może przeprowadzać wstępną autoryzację i uwierzytelnianie żądań, zanim zostaną przekazane do mikroserwisów.
- agregacja agregować odpowiedzi z wielu mikroserwisów i dostarczać je jako jedną skonsolidowaną odpowiedź do klienta.
- spring cloud gatwey, zuul
- global filters to tracing, logging
Czym jest loadbalancer
- urządzenie lub oprogramowanie
- głównym zadaniem jest równomierne rozdzielenie ruchu sieciowego między mikroserwisami
- zapewnia, że ząden mikroserwis nie jest przeciążony
- zapewnia wysoką dostępność i odporność na awarie systemu
- przykład AWS Elastic Load Balancing
Jak działa loadbalancer
- dystrybucja ruchu monitoruje ilość ruchu i żadań przychodzących do serwera i na tej podstawej dytrybuuje ruch do róznych serwerów
- Health Checks sprawdza stan serwerów , czy odpowiadają na pingi) jeśli wykryje, że serwer jest niedostępny do nie będzie kierował
- High Availabillity zapewnia, że awaria jednego serwera nie spowoduje niedostępności usługi
- Optymalizacja wykorzystania zasobów
Algorytmy Load balancingu
- Round Robin:
- Least Connections
- IP Hash
Round Robin
- Każdy serwer otrzymuje żądanie po kolei w równych odstępach czasu.
- Jest prosty w implementacji, ale nie bierze pod uwagę aktualnego obciążenia serwera.
Least Connections:
- Żądania są kierowane do serwera z najmniejszą liczbą aktywnych połączeń.
- Dobrze sprawdza się w środowiskach, gdzie sesje są długie i zróżnicowane pod kątem zasobów.
Circuti Breaker
- wzorzec stosowany mikroserwisach
- TRZY STANY - CLOSED, HALF_OPEN, OPEN
- ideą jest wykrycie awarri usługi i uniemożliwienie wysyłania do niej kolejnych żadań
- może być zaimplmentowany poprzez dodanie warstwy pomiędzy usługa wykonująca a zależna
- warstwa ta działa jak przełącznik - blokuje gdy usługa nie działa
- ma na celu zapobiegania łańcuchowym awariom i zapewnienia odporności systemu
- Hystrix (lub Resilience4J)
OpenFeign
- wspiera synchroniczną komunikację miedzy serwsiami
- pozwala tworzyć klientów interfejsów HTTP w sposób dekleratywny
- definiujesz @FeignClinet interfejs z abstrakcyjnymi metodami
- ułatwia wywoływanie metod REST Api innego mikroserwisy jakby były to lokalne metody javy
Saga
- sekwencja lokalny transakcji
- każda lokalna transkacja aktualizuje baze danych i publikuje event, który triggeruje kolejna transkacje
- jeśli transkacja lokalna się nie powiedzie do działanie kompensujące poprzedniej.
- sercem jest Eventual consistency - system w końcu osiągnie spójność
- komunikacja asnynchroniczna między mikroserwisami
- Saga log - przechowuje każda transakcje i kompensacje
- latencja
Saga Choreography
Nie ma centralnego punktu orkiestracji.
1. Klient składa zamówienie order-service
2. Order-service rejestruje zamówienie w bazie ze statusem CREATED oraz publikuje na kolejke event OrderCreated
3. Payment-service nasłuchuje zdarzeń OrderCreated
4. Gdy payment-service odbiera zdarzenie OrderCreated przetwarza płatność
5. Jeśli płatność sie powiedzie - publikuje PaymentFailed a jeśli się powiedzie PaymentProcessed
6. Order-serivce nasłuchuje zdarzeń PaymentProcessed i PaymentFailed
- Komunikacja między mikroserwisami jest asynchroniczna, co zwiększa skalowalność i odporność systemu.
- Każdy mikroserwis zarządza własną logiką i reaguje na zdarzenia, na które jest subskrybowany.
- System osiąga spójność ostateczną, nie gwarantuje natychmiastowej spójności w każdym punkcie procesu.
EventSourcing
- w stanie aplikacji jest przechowywana sekwencja zdarzeń na EventStore
- zamiast zapisywać tylko bieżący stan obiektu domenowego, zapisuje każde zmianę jako zdarzenie w trwałym logu zdarzeń
- stan aplikacji może być odtworzony przez doczytanie i zastosowanie wszystkich zdarzeń od początku
- spójność jest zapewniona przez sekwencyjne przetwarzanie zdarzeń i fakt, że zdarzenia są niezmienne po ich zapisaniu.
- jest używany w rozproszonych systemach, gdzie tradycyjne zarządzanie transakcjami jest trudniejsze.
Even Sourcing przykład order-service oraz payment-service
Typy zdarzeń
OrderCreated:
OrderUpdated:
PaymentReceived:
OrderShipped:
OrderCancelled:
- każde zdarzenie zawiera kluczowe informacje, takie jak identyfikator zamówienia, timestamp
- zdarzenia są zapisywane w kolejności ich występowania w bazie
- aby odtworzyć bieżacy stan od najstarszego
CQRS Pattern
- rozdzielenie READ i WRITE zzamiast posiadania jednego interfejsu obługującym te dwie operacje
- Commad - operacje WRITE, modyfikują stan ale nic nie zwracaja
- Query - operacje READ, zwracają
- aplikacja może mieć inne wymagania dotyczące READ i WRITE np. 5% WRITE i 95 % READ
- pozwala na niezależne skalowanie - wzrost wydajności
- łączy się z EventSourcing