Saga elosztott tranzakciók mintája

Azure

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 áttekintése.

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.

Koreográfia áttekintése

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.

Vezénylés áttekintése

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.

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.