A Saga tervezési mintája az elosztott tranzakciós forgatókönyvekben a mikroszolgáltatások adatkonzisztenciájának kezelésére szolgáló módszer. A saga tranzakciók sorozata, amely frissíti az egyes szolgáltatásokat, és közzétesz egy üzenetet vagy eseményt a következő tranzakciós lépés elindításához. Ha egy lépés meghiúsul, a saga kompenzáló tranzakciókat hajt végre, amelyek ellensúlyozzák az előző tranzakciókat.
Kontextus és probléma
A tranzakció egyetlen logikai vagy munkaegység, amely néha több műveletből áll. A tranzakción belül az esemény egy entitás állapotváltozása, és egy parancs tartalmazza a művelet végrehajtásához vagy egy későbbi esemény indításához szükséges összes információt.
A tranzakcióknak atominak, konzisztensnek, izoláltnak és tartósnak (ACID) kell lenniük. Az egyetlen szolgáltatáson belüli tranzakciók ACID-nak számítanak, de a szolgáltatásközi adatkonzisztencia szolgáltatásközi tranzakciókezelési stratégiát igényel.
Többszolgáltatásos architektúrákban:
- Az atomiság oszthatatlan és visszavonhatatlan műveletkészlet, amely minden esetben bekövetkezik, vagy egyik sem fordul elő.
- A konzisztencia azt jelenti, hogy a tranzakció csak az egyik érvényes állapotból egy másik érvényes állapotba hozza az adatokat.
- Az elkülönítés garantálja, hogy az egyidejű tranzakciók ugyanazt az adatállapotot eredményezik, mint a szekvenciálisan végrehajtott tranzakciók.
- A tartósság biztosítja, hogy a véglegesített tranzakciók még rendszerhiba vagy áramkimaradás esetén is véglegesítve maradjanak.
Az adatbázisonkénti mikroszolgáltatás-modell számos előnnyel jár a mikroszolgáltatás-architektúrák számára. A tartományi adatok beágyazása lehetővé teszi, hogy minden szolgáltatás a legjobb adattártípust és sémát használja, szükség szerint skálázza saját adattárát, és szigetelje más szolgáltatások hibáitól. A szolgáltatásspecifikus adatbázisok adatkonzisztenciájának biztosítása azonban kihívást jelent.
Az elosztott tranzakciók, például a kétfázisú véglegesítési (2PC) protokoll megkövetelik, hogy a tranzakció minden résztvevője véglegesítse vagy visszaállítsa a tranzakciót, mielőtt a tranzakció folytatódhat. Néhány résztvevő implementációja, például a NoSQL-adatbázisok és az üzenetközvetítés azonban nem támogatja ezt a modellt.
Egy másik elosztott tranzakciós korlátozás a folyamatközi kommunikáció (IPC) szinkronizálása és rendelkezésre állása. Az operációs rendszer által biztosított IPC lehetővé teszi a különálló folyamatok számára az adatok megosztását. Az elosztott tranzakciók véglegesítéséhez minden résztvevő szolgáltatásnak elérhetőnek kell lennie, ami csökkentheti a rendszer általános elérhetőségét. Az IPC-vel vagy tranzakciós korlátozásokkal rendelkező architekturális megvalósítások a Saga-minta jelöltjei.
Megoldás
A Saga-minta a tranzakciókezelést helyi tranzakciók sorozatával biztosítja. A helyi tranzakció a saga résztvevő által végzett atomi munkamennyiség. Minden helyi tranzakció frissíti az adatbázist, és közzétesz egy üzenetet vagy eseményt, amely elindítja a következő helyi tranzakciót a saga-ban. Ha egy helyi tranzakció meghiúsul, a saga kompenzáló tranzakciók sorozatát hajtja végre, amelyek visszavonják az előző helyi tranzakciók által végrehajtott módosításokat.
A Saga-mintákban:
- A kompenzálható tranzakciók olyan tranzakciók, amelyek esetleg megfordíthatók egy másik, ellentétes hatású tranzakció feldolgozásával.
- A kimutatástranzakció egy saga go/no-go pontja. Ha a kimutatástranzakció véglegesítése történik, a saga a befejezésig fut. A kimutatástranzakció lehet olyan tranzakció, amely nem kompenzálható és nem újrapróbálható, vagy lehet az utolsó kompenzálható tranzakció vagy a saga első újrapróbálkozási tranzakciója.
- Az újrapróbálható tranzakciók olyan tranzakciók, amelyek a kimutatást követik, és garantáltan sikeresek lesznek.
Két közös saga megvalósítási megközelítés, koreográfia és vezénylés. Minden megközelítésnek megvannak a maga kihívásai és technológiái a munkafolyamat koordinálásához.
Koreográfia
A koreográfia egy olyan módszer, ahová a résztvevők központosított vezérlési pont nélkül cserélnek eseményeket. Koreográfia esetén minden helyi tranzakció olyan tartományi eseményeket tesz közzé, amelyek helyi tranzakciókat váltanak ki más szolgáltatásokban.
Előnyök
- Olyan egyszerű munkafolyamatokhoz használható, amelyekhez kevés résztvevőre van szükség, és nincs szükség koordinációs logikára.
- Nem igényel további szolgáltatás-implementációt és karbantartást.
- Nem vezet be egyetlen meghibásodási pontot, mivel a felelősségek a saga résztvevői között oszlanak meg.
Hátránya
- A munkafolyamat zavaróvá válhat az új lépések hozzáadásakor, mivel nehéz nyomon követni, hogy melyik saga résztvevői melyik parancsokat hallgatják.
- Fennáll annak a veszélye, hogy a saga résztvevői ciklikus függőséget jelentenek, mert egymás parancsait kell használniuk.
- Az integráció tesztelése nehéz, mert minden szolgáltatásnak futnia kell egy tranzakció szimulálásához.
Vezénylés
A vezénylés egy olyan módszer, ahová egy központi vezérlő tájékoztatja a saga résztvevőit, hogy milyen helyi tranzakciókat kell végrehajtani. A saga vezénylő kezeli az összes tranzakciót, és tájékoztatja a résztvevőket, hogy az események alapján melyik műveletet hajtják végre. A vezénylő sagakéréseket hajt végre, tárolja és értelmezi az egyes feladatok állapotát, és kompenzáló tranzakciókkal kezeli a sikertelen helyreállítást.
Előnyök
- Kiválóan alkalmas olyan összetett munkafolyamatokhoz, amelyekben sok résztvevő vagy új résztvevő vesz részt az idő múlásával.
- Akkor alkalmas, ha a folyamat minden résztvevője felett van ellenőrzés, és szabályozható a tevékenységek áramlása.
- Nem vezet be ciklikus függőségeket, mert a vezénylő egyoldalúan függ a saga résztvevőitől.
- A Saga-résztvevőknek nem kell tudniuk a többi résztvevő parancsairól. Az aggodalmak egyértelmű elkülönítése leegyszerűsíti az üzleti logikát.
Hátránya
- A tervezés további összetettsége egy koordinációs logika implementálását igényli.
- Van még egy hibapont, mert a vezénylő kezeli a teljes munkafolyamatot.
Problémák és megfontolandó szempontok
A Saga-minta megvalósításakor vegye figyelembe a következő pontokat:
- A Saga-minta kezdetben kihívást jelenthet, mivel új gondolkodásmódot igényel a tranzakciók koordinálásához és a több mikroszolgáltatást felölelő üzleti folyamatok adatkonzisztenciájának fenntartásához.
- A Saga-minta különösen nehéz hibakeresést végezni, és a résztvevők növekedésével egyre összetettebbé válik.
- Az adatok nem állíthatók vissza, mert a saga résztvevői módosításokat hajtanak végre a helyi adatbázisaikban.
- A megvalósításnak képesnek kell lennie a lehetséges átmeneti hibák kezelésére, valamint idempotencia biztosítására a mellékhatások csökkentése és az adatkonzisztencia biztosítása érdekében. Az idempotencia azt jelenti, hogy ugyanazt a műveletet többször is megismételheti a kezdeti eredmény módosítása nélkül. További információkért lásd az idempotencia biztosításáról szóló útmutatót az üzenetek feldolgozásakor és az állapot közös frissítésekor.
- A legjobb, ha megfigyelhetőséget valósít meg a saga munkafolyamat figyeléséhez és nyomon követéséhez.
- A résztvevők adatelkülönítésének hiánya tartóssági kihívásokat támaszt. A saga implementálásának tartalmaznia kell az anomáliák csökkentésére irányuló ellenintézkedéseket.
A következő anomáliák megfelelő mértékek nélkül fordulhatnak elő:
- Elveszett frissítések, amikor az egyik saga egy másik saga módosításainak olvasása nélkül ír.
- Piszkos olvasások, amikor egy tranzakció vagy egy saga egy olyan saga frissítéseit olvassa be, amely még nem fejezte be ezeket a frissítéseket.
- Fuzzy/nonrepeatable olvasások, amikor a különböző saga lépések különböző adatokat olvasnak, mert adatfrissítés történik az olvasások között.
Az anomáliák csökkentésére vagy megelőzésére javasolt ellenintézkedések a következők:
- Szemantikai zárolás, egy alkalmazásszintű zárolás, amelyben egy saga kompenzálható tranzakciója egy szemafor használatával jelzi, hogy a frissítés folyamatban van.
- Inmutatív frissítések , amelyek bármilyen sorrendben végrehajthatók, és ugyanazt az eredményt eredményezik.
- Pesszimista nézet: Lehetséges, hogy az egyik saga beolvassa a piszkos adatokat, míg egy másik saga egy kompenzálható tranzakciót futtat a művelet visszaállításához. A pesszimista nézet átrendezi a saga-t, így a mögöttes adatok egy újrapróbálható tranzakcióban frissülnek, ami kiküszöböli a piszkos olvasás lehetőségét.
- Az újraolvasási érték ellenőrzi, hogy az adatok változatlanok-e, majd frissítik a rekordot. Ha a rekord megváltozott, a lépések megszakadhatnak, és a saga újraindulhat.
- A verziófájl a beérkezésükkor rögzíti a rekord műveleteit, majd a megfelelő sorrendben hajtja végre őket.
- Érték szerint az egyes kérések üzleti kockázatával dinamikusan kiválasztja az egyidejűségi mechanizmust. Az alacsony kockázatú kérések a sagast részesítik előnyben, míg a nagy kockázatú kérések az elosztott tranzakciókat részesítik előnyben.
Mikor érdemes ezt a mintát használni?
A Saga mintát akkor használja, ha a következőkre van szüksége:
- Biztosítsa az adatok konzisztenciáját egy elosztott rendszerben szoros összekapcsolás nélkül.
- Visszaállítás vagy kompenzálás, ha a sorozat egyik művelete meghiúsul.
A Saga minta kevésbé alkalmas a következőkre:
- Szorosan összekapcsolt tranzakciók.
- Kompenzáló tranzakciók, amelyek a korábbi résztvevőknél fordulnak elő.
- Ciklikus függőségek.
Példa
A kiszolgáló nélküli vezénylésen alapuló Saga egy saga implementációs referencia a vezénylési megközelítéssel, amely sikeres és sikertelen munkafolyamatokkal szimulál egy pénzátutalási forgatókönyvet.
Következő lépések
- Elosztott adatok
- Richardson, Chris. 2018: Mikroszolgáltatás-minták. Manning Publications.
Kapcsolódó források (lehet, hogy a cikkek angol nyelvűek)
A következő minták is hasznosak lehetnek ennek a mintának a végrehajtása során:
- A koreográfia a rendszer minden összetevője részt vesz az üzleti tranzakciók munkafolyamatával kapcsolatos döntéshozatali folyamatban, ahelyett, hogy központi ellenőrzési pontra támaszkodik.
- A kompenzáló tranzakciók visszavonják a lépések sorozata által elvégzett munkát, és végül konzisztens műveletet határoznak meg, ha egy vagy több lépés meghiúsul. A felhőalapú alkalmazások, amelyek összetett üzleti folyamatokat és munkafolyamatokat implementálnak, gyakran követik ezt a végleges konzisztenciamodellt.
- Az újrapróbálkozás lehetővé teszi, hogy az alkalmazás a sikertelen művelet transzparens újrapróbálásával kezelje az átmeneti hibákat, amikor megpróbál csatlakozni egy szolgáltatáshoz vagy hálózati erőforráshoz. Az újrapróbálkozás javíthatja az alkalmazás stabilitását.
- Az áramkör-megszakító kezeli azokat a hibákat, amelyek helyreállítása változó ideig tart, amikor távoli szolgáltatáshoz vagy erőforráshoz csatlakozik. Az áramkör-megszakító javíthatja az alkalmazások stabilitását és rugalmasságát.
- Az állapotvégpont-monitorozás funkcionális ellenőrzéseket végez egy alkalmazásban, amelyet külső eszközök rendszeres időközönként érhetnek el a közzétett végpontokon keresztül. Az állapotvégpont monitorozása segíthet ellenőrizni, hogy az alkalmazások és szolgáltatások megfelelően teljesítenek-e.