Saga elosztott tranzakciók mintája

Azure

Az elosztott rendszerek adatkonzisztenciájának fenntartása a helyi tranzakciók több szolgáltatás közötti összehangolásával. Minden szolgáltatás végrehajtja a műveletet, és elindítja a következő lépést eseményeken vagy üzeneteken keresztül. Ha egy lépés meghiúsul, a kompenzáló tranzakciók sorozata visszavonja a végrehajtott lépéseket.

Környezet és probléma

A tranzakciós egy munkaegységet jelöl, amely több műveletet is tartalmazhat. Egy tranzakción belül egy esemény egy entitást érintő állapotváltozásra utal. A parancsok egy művelet végrehajtásához vagy egy későbbi esemény indításához szükséges összes információt beágyaznak.

A tranzakcióknak meg kell felelnie az atomiság, a konzisztencia, az elkülönítés és a tartósság (ACID) alapelveinek.

  • Atomitás: Minden művelet sikeres, vagy nincs sikeres művelet.
  • Konzisztencia: Az adat egyik érvényes állapotból egy másik érvényes állapotba kerül át.
  • Elkülönítés: Egyidejű tranzakciók ugyanazokat az eredményeket eredményezik, mint a szekvenciális tranzakciók.
  • tartósság: módosítások a véglegesítése után is megmaradnak, még akkor is, ha hibák lépnek fel.

Egyetlen szolgáltatásban a tranzakciók az ACID alapelveit követik, mivel egyetlen adatbázisban működnek. Azonban összetettebb lehet az ACID-megfelelőség elérése több szolgáltatásban.

A mikroszolgáltatás-architektúrák kihívásai

A mikroszolgáltatás-architektúrák általában egy dedikált adatbázist rendelnek az egyes mikroszolgáltatásokhoz. Ez a megközelítés számos előnnyel jár:

  • Minden szolgáltatás a saját adatait foglalja magában.
  • Minden szolgáltatás a legmegfelelőbb adatbázis-technológiát és sémát használhatja az adott igényeinek megfelelően.
  • Az egyes szolgáltatások adatbázisai egymástól függetlenül méretezhetők.
  • Az egyik szolgáltatás hibái el vannak különítve a többi szolgáltatástól.

Ezen előnyök ellenére ez az architektúra bonyolítja a szolgáltatásközi adatkonzisztenciát. A hagyományos adatbázis-garanciák, például az ACID nem alkalmazhatók közvetlenül több egymástól függetlenül felügyelt adattárra. Ezen korlátozások miatt a folyamatközi kommunikációra támaszkodó architektúrák vagy a hagyományos tranzakciómodellek, például a kétfázisú véglegesítési protokollok gyakran jobban megfelelnek a Saga-mintához.

Megoldás

A Saga minta úgy kezeli a tranzakciókat, hogy azokat egymást követő helyi tranzakciókra bontja.

saga áttekintését bemutató diagram.

Minden helyi tranzakció:

  1. A munkát atomi módon végzi el egyetlen szolgáltatáson belül.
  2. Frissíti a szolgáltatás adatbázisát.
  3. A következő tranzakciót eseményen vagy üzeneten keresztül kezdeményezi.

Ha egy helyi tranzakció meghiúsul, a saga kompenzáló tranzakciók sorozatát hajtja végre, az előző helyi tranzakciók módosításainak megfordításához.

A Saga-minta fő fogalmai

  • Kompenzálható tranzakciók visszavonhatók, vagy más, ellentétes hatású tranzakciók által kompenzálhatók. Ha a saga egy lépése meghiúsul, a kompenzáló tranzakciók visszavonják a kompenzálható tranzakciók módosításait.

  • Pivottranzakciók jelentik azt a pontot a sagában, ahonnan nincs visszatérés. A pivottranzakció sikeres végrehajtása után a kompenzálható tranzakciók már nem relevánsak. Minden további műveletet végre kell hajtani ahhoz, hogy a rendszer konzisztens végső állapotot érjen el. A pivot tranzakció a saga folyamatától függően különböző szerepköröket tölthet be:

    • visszavonhatatlan vagy nem kompenzálható tranzakciókat nem lehet visszavonni vagy újrapróbálni.

    • A visszavonható és a végleges közötti határ azt jelenti, hogy a pivottranzakció lehet az utolsó visszavonható, illetve kompenzálható tranzakció. Vagy ez lehet a saga első újrapróbálkozási művelete.

  • Újrapróbálkozható tranzakciók követik a sarkalatos tranzakciót. A megismételhető tranzakciók idempotensek, és segítenek biztosítani, hogy a saga elérhesse a végső állapotát, még átmeneti hibák fellépése esetén is. Segítenek abban, hogy a saga végül elérje a konzisztens állapotot.

A Saga implementálási megközelítései

A saga megvalósításának két tipikus megközelítése a koreográfia és az orkesztráció. 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áfiai megközelítésben a szolgáltatások központosított vezérlő nélkül cserélik le az eseményeket. Koreográfia esetén minden helyi tranzakció doméneseményeket tesz közzé, amelyek más szolgáltatásokban helyi tranzakciókat váltanak ki.

olyan diagram, amely koreográfiával ábrázol egy sagát.

A koreográfia előnyei A koreográfia hátrányai
Olyan egyszerű munkafolyamatokhoz használható, amelyek kevés szolgáltatással rendelkeznek, és nem igényelnek koordinációs logikát. A munkafolyamat zavaró lehet, ha új lépéseket ad hozzá. Nehéz nyomon követni, hogy az egyes saga-résztvevők mely parancsokra válaszolnak.
A koordinációhoz nincs szükség más szolgáltatásra. Fennáll a kockázata annak, hogy ciklikus függőség alakul ki a saga résztvevői között, mert fel kell dolgozniuk egymás parancsait.
Nem vezet be egyetlen meghibásodási pontot, mert a felelősségek a saga résztvevői között oszlanak meg. Az integrációs tesztelés nehéz, mert minden szolgáltatásnak futnia kell egy tranzakció szimulálásához.

Hangszerelés

A vezénylés során egy központi vezérlő vagy vezénylőkezeli az összes tranzakciót, és tájékoztatja a résztvevőket, hogy 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ók használatával kezeli a hibák helyreállítását.

A vezénylést használó sagát bemutató diagram.

Az orchesztráció előnyei Az orchesztráció hátrányai
Összetett munkafolyamatokhoz vagy új szolgáltatások hozzáadásához jobban megfelel. A tervezés egyéb összetettsége megköveteli a koordinációs logika implementálását.
Elkerüli a ciklikus függőségeket, mert a vezénylő kezeli a folyamatot. Hibapontot vezet be, mert a vezénylő kezeli a teljes munkafolyamatot.
A felelősségek egyértelmű elkülönítése leegyszerűsíti a szolgáltatás logikáját.

Problémák és szempontok

Vegye figyelembe a következő szempontokat, amikor úgy dönt, hogy hogyan valósítja meg ezt a mintát:

  • Váltás a tervezési gondolkodásban: A Saga minta bevezetése más gondolkodásmódot igényel. Ehhez több mikroszolgáltatás tranzakciókoordinációjára és adatkonzisztenciájára kell összpontosítania.

  • hibakeresési saga összetettsége: hibakeresési saga összetett lehet, különösen a részt vevő szolgáltatások számának növekedésével.

  • Visszavonhatatlan helyi adatbázis-módosítások: Az adatok nem állíthatók vissza, mert a saga résztvevői módosításokat véglegesítettek a saját adatbázisaikban.

  • Átmeneti hibák és idempotencia kezelése: A rendszernek hatékonyan kell kezelnie az átmeneti hibákat, és biztosítania kell az idempotenciát, amikor ugyanazt a műveletet megismételi, nem változtatja meg az eredményt. További információ: Idempotens fogyasztói minta.

  • A saga monitorozásának és nyomon követésének szükségessége: A saga munkafolyamatának monitorozása és nyomon követése alapvető feladat a működési felügyelet fenntartásához.

  • Kompenzáló tranzakciók korlátozásai: Kompenzáló tranzakciók nem mindig sikeresek, ami inkonzisztens állapotban hagyhatja a rendszert.

Lehetséges adatrendellenességek a saga-ban

Az adatrendellenességek inkonzisztenciák, amelyek akkor fordulhatnak elő, ha a sagak több szolgáltatás között működnek. Mivel minden szolgáltatás kezeli a saját adatait, az úgynevezett résztvevők adatait, nincs beépített elkülönítés a szolgáltatások között. Ez a beállítás adatkonzisztenciákat vagy tartóssági problémákat okozhat, például részben alkalmazott frissítéseket vagy a szolgáltatások közötti ütközéseket. Jellemző problémák a következők:

  • Elveszett frissítések: Ha az egyik saga módosítja az adatokat anélkül, hogy figyelembe venné egy másik saga módosításait, az felülírt vagy hiányzó frissítéseket eredményez.

  • Piszkos olvasás: Amikor egy saga vagy tranzakció olyan adatokat olvas, amelyeket egy másik saga módosított, de a módosítás még nem fejeződött be.

  • homályos vagy nem megismételhető olvasások: Ha a saga különböző lépései inkonzisztens adatokat olvasnak, mert frissítések történnek az olvasások között.

Az adatrendellenességek kezelésére vonatkozó stratégiák

Ezeknek az anomáliáknak a csökkentéséhez vagy megelőzéséhez vegye figyelembe a következő ellenintézkedéseket:

  • Szemantikai zárolás: Használjon alkalmazásszintű zárolásokat, amikor egy saga kompenzálható tranzakciója szemafort használ annak jelzésére, hogy egy frissítés folyamatban van.

  • Ingmutatív frissítések: Tervfrissítések, hogy bármilyen sorrendben alkalmazhatók legyenek, miközben továbbra is ugyanazt az eredményt eredményezik. Ez a megközelítés segít csökkenteni a saga-k közötti ütközéseket.

  • pesszimista nézet: átrendezi a saga sorrendjét, hogy az adatfrissítések újrapróbálkozási tranzakciókban történjenek a piszkos olvasások kiküszöbölése érdekében. Ellenkező esetben az egyik saga beolvashatja a piszkos adatokat, vagy nem véglegesített módosításokat, míg egy másik saga egyszerre hajt végre egy kompenzálható tranzakciót a frissítések visszaállításához.

  • Újraolvasási értékek: Ellenőrizze, hogy az adatok nem változnak-e a frissítések megkezdése előtt. Ha az adatok megváltoznak, állítsa le az aktuális lépést, és szükség szerint indítsa újra a saga-t.

  • Verziófájlok: Egy rekordon végrehajtott összes művelet naplójának karbantartása, és az ütközések elkerülése érdekében győződjön meg arról, hogy azok a megfelelő sorrendben vannak végrehajtva.

  • kockázatalapú egyidejűség érték alapján: Dinamikusan válassza ki a megfelelő egyidejűségi mechanizmust a lehetséges üzleti kockázat alapján. Használjon például saga-t alacsony kockázatú frissítésekhez és elosztott tranzakciókhoz a magas kockázatú frissítésekhez.

Mikor érdemes használni ezt a mintát?

Használja ezt a mintát a következő esetekben:

  • Szoros összekapcsolás nélkül kell biztosítania az adatok konzisztenciáját egy elosztott rendszerben.
  • Vissza kell állítania az előző állapotot, vagy kompenzálnia kell, ha a műveletsor egyik művelete meghiúsul.

Ez a minta nem feltétlenül megfelelő, ha:

  • A tranzakciók szorosan kapcsolódnak egymáshoz.
  • A kompenzáló tranzakciók a korábbi résztvevőknél fordulnak elő.
  • Vannak ciklikus függőségek.

Következő lépés

  • Natív felhőbeli adatminták

A minta megvalósításakor a következő minták lehetnek relevánsak:

  • A koreográfiai minta a rendszer minden összetevője részt vesz egy üzleti tranzakció munkafolyamatával kapcsolatos döntéshozatali folyamatban, ahelyett, hogy központi ellenőrzési pontra támaszkodik.

  • A kompenzáló tranzakcióminta visszavonja a lépések sorozata által végzett munkát, és végül konzisztens műveletet határoz meg, ha egy vagy több lépés meghiúsul. Az összetett üzleti folyamatokat és munkafolyamatokat megvalósító felhőalapú alkalmazások gyakran követik ezt a végleges konzisztenciamodellt.

  • Az Újrapróbálkozási minta lehetővé teszi, hogy az alkalmazás kezelje az átmeneti hibákat, amikor megpróbál csatlakozni egy szolgáltatáshoz vagy hálózati erőforráshoz a sikertelen művelet transzparens újrapróbálkozásával. Ez a minta javíthatja az alkalmazás stabilitását.

  • A Circuit Breaker minta olyan hibákat kezel, amelyek helyreállítása változó időt vesz igénybe, amikor távoli szolgáltatáshoz vagy erőforráshoz csatlakozik. Ez a minta javíthatja az alkalmazások stabilitását és rugalmasságát.

  • Az állapotvégpont monitorozási mintája olyan alkalmazásokban implementálja a funkcionális ellenőrzéseket, amelyekhez külső eszközök rendszeres időközönként hozzáférhetnek a közzétett végpontokon keresztül. Ez a minta segíthet ellenőrizni, hogy az alkalmazások és szolgáltatások megfelelően teljesítenek-e.