- 2024-02-17
- Papp Miklós
Mik azok a microservice tervezési minták?
A mikroszolgáltatás független alkalmazáskomponensekből áll, amelyek egy rendszer számára specifikus funkciókat hajtanak végre. Egyetlen példánya vagy több példánya is lehet a funkcionális követelmények alapján.
A kliensoldali (webes felület és mobilos UI) és a köztes rétegekben lévő más integrált szolgáltatásokkal együtt ezek a mikroszolgáltatások mindegyike egy teljes architektúrát alkot.
Az ilyen mikroszolgáltatás-architektúra tervezése, fejlesztése és telepítése azonban kihívásokkal jár, mint például:
- Közös hozzáférés kezelése
- Adatkonzisztencia
- Szolgáltatások biztonsága
- Szolgáltatások közötti kommunikáció
- Függőségkezelés
Itt jönnek a képbe a mikroszolgáltatás tervezési minták (microservice design patterns)! Ezek olyan referenciaarchitektúrás minták, amelyek segítenek a szolgáltatások hatékonyabb adminisztrációjában, ezeknek a kihívásoknak a leküzdésében és a teljesítmény maximalizálásában.
Sőt, a mikroszolgáltatásokban az Ön felhasználási eseteihez megfelelő tervezési minták alkalmazása növelheti a komponensek újrafelhasználhatóságát, ami végül a fejlesztési idő és erőfeszítések csökkenését eredményezi. Idővel az újrafelhasználhatóság kiküszöböli a szükségtelen újrafejlesztést az alkalmazás módosításainál.
A 10 legfontosabb microservice tervezési minta
Fontos megjegyezni, hogy a mikroszolgáltatás tervezési minták nem csodaszerek! Minden tervezési mintának megvannak a maga előnyei és hátrányai. A következőkben az alábbi 10 tervezési mintát mutatjuk be röviden:
- Strangler Fig
- SAGA
- Aggregator
- Event Source
- CQRS
- Sidecar
- Database per microservice
- Backend For Frontends (BFF)
- Api Gateway
- Circuit Braker
2. SAGA minta
A Saga egy tervezési minta, amely az elosztott tranzakciók kezelésére szolgál mikroszolgáltatás-architektúrákban. Biztosítja az atomicity tulajdonságot, azaz a tranzakció minden műveletének sikeresen kell befejeződnie, különben az egész tranzakciót vissza kell állítani.
A Saga minta működése:
- Tranzakció kezdeményezése: A kliens egy tranzakciót indít el az egyik mikroszolgáltatásnál.
- Terjedés: A mikroszolgáltatás további mikroszolgáltatásokat hív meg a tranzakció végrehajtásához. Minden mikroszolgáltatás elvégzi a saját feladatát, és regisztrál egy kompenzációs műveletet a Saga koordinátornál.
- Sikeres befejezés: Ha minden mikroszolgáltatás sikeresen végrehajtja a feladatát, a tranzakció sikeresnek minősül. A Saga koordinátor megerősíti a végrehajtást minden részt vevő mikroszolgáltatásnál.
- Hiba esetén: Ha valamelyik mikroszolgáltatás hibát észlel a tranzakció során, a Saga koordinátort értesíti a hibáról.
- Kompenzáció: A Saga koordinátor elindítja a korábban regisztrált kompenzációs műveleteket az összes részt vevő mikroszolgáltatásnál, visszaállítva az állapotot a tranzakció kezdeti állapotára.
A Saga minta előnyei:
- Atomicity: Biztosítja, hogy a tranzakció minden művelete vagy együttesen sikerüljön, vagy együttesen hibázzon.
- Skalázhatóság: A mikroszolgáltatások függetlenül skálázhatók.
- Hibakezelés: Lehetővé teszi a hibák hatékony kezelését és a tranzakció visszaállítását.
A Saga minta hátrányai:
- Komplexitás: A Saga minta implementálása összetett lehet, főleg nagy és összetett tranzakciók esetén.
- Egyetlen hiba pont: A Saga koordinátor egyetlen hiba ponttá válhat, ha nem kezelik megfelelően.
Mikor használjuk a Saga mintát?
A Saga mintát akkor érdemes alkalmazni, ha:
- Több mikroszolgáltatáson keresztül kell tranzakciót végrehajtani.
- A tranzakciónak atomikusnak kell lennie.
- Fontos a tranzakció hibájának hatékony kezelése.
- A tranzakcióban részt vevő mikroszolgáltatások száma és a tranzakcióban végrehajtott műveletek száma nem túl nagy.
Mikor nem érdemes a Saga mintát alkalmazni?
A Saga mintát nem érdemes alkalmazni, ha a tranzakció nem atomikus, ha a tranzakcióban részt vevő mikroszolgáltatások száma és a tranzakcióban végrehajtott műveletek száma nagy, és ha a kompenzációs műveletek összetettek.
Példa a Saga mintára:
Tegyük fel, hogy egy utazási foglalási rendszert fejlesztünk, amely repülőjegy-foglalást, szállásfoglalást és autókölcsönzést foglal magában. A Saga mintát használhatjuk annak biztosítására, hogy a felhasználó egyszerre foglalhasson repülőjegyet, szállást és autót. Ha a tranzakció során hiba lép fel (például a repülőjegy-foglalás sikertelen), a Saga minta visszaállítja a szállás- és autókölcsönzés-foglalásokat is.
A Saga minta implementációja:
A Saga minta implementációja két fő megközelítést alkalmaz:
Koreográfia: Decentralizált megközelítés, ahol minden mikroszolgáltatás önállóan publikál eseményeket a következő lépés elindítására.
Orchestration: Központi kontroller (orchestrator) kezeli a teljes Saga folyamatot, egymás után hívva meg a helyi tranzakciókat.
A Saga minta összetettsége:
A Saga minta implementációja összetett lehet, főleg nagy és összetett tranzakciók esetén. A komplexitás oka a következő:
- A tranzakcióban részt vevő mikroszolgáltatások száma.
- A tranzakcióban végrehajtott műveletek száma.
- A kompenzációs műveletek összetettsége.
A Saga minta előnyeinek és hátrányainak összegzése:
Előnyök:
- Atomicity garanciája
- Skalázhatóság
- Hatékony hibakezelés
Hátrányok:
- Komplexitás
- Egyetlen hiba pont
Alternatívák a Saga mintára:
- Egyszerű tranzakciók: Ha a tranzakció egyszerű és nem atomikus, akkor nem szükséges a Saga minta használata.
- Komplex tranzakciók: Ha a tranzakció összetett és atomikusnak kell lennie, akkor a kétfázisú elkötelezettség (2PC) használata is lehetséges.
Összefoglalás:
A Saga minta egy hasznos eszköz az elosztott tranzakciók kezelésére mikroszolgáltatás-architektúrákban. A minta implementálása összetett lehet, de számos előnnyel jár, mint az atomicity garanciája, a skálázhatóság és a hatékony hibakezelés. A Saga mintát akkor érdemes alkalmazni, ha a tranzakciónak atomikusnak kell lennie, és ha a tranzakcióban részt vevő mikroszolgáltatások száma és a tranzakcióban végrehajtott műveletek száma nem túl nagy.
További források:
- Saga Pattern: https://microservices.io/pattern s/data/saga.html
- Microservices Saga Pattern: https://www.baeldung.com/cs/saga-pattern-microservices