A Saga tervezési mintája segít fenntartani az adatok konzisztenciáját az elosztott rendszerekben a tranzakciók több szolgáltatás közötti koordinálásával. A saga helyi tranzakciók sorozata, ahol 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 a sorozat egy lépése meghiúsul, a saga kompenzáló tranzakciókat hajt végre a befejezett lépések visszavonásához. Ez a megközelítés segít fenntartani az adatkonzisztenciát.
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 adatok áttűnnek egy érvényes állapotból egy másik érvényes állapotba.
- 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 helyi tranzakciók sorozatára.
Minden helyi tranzakció:
- A munkát atomi módon végzi el egyetlen szolgáltatáson belül.
- Frissíti a szolgáltatás adatbázisát.
- 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 kompenzálhatók más, ellentétes hatású tranzakció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.
kimutatástranzakciók a saga visszatérési pontjaként szolgálnak. A kimutatástranzakció sikerességét követően 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 kimutatástranzakciók a saga folyamatától függően különböző szerepköröket feltételezhetnek:
visszavonhatatlan vagy nem kompenzálható tranzakciókat nem lehet visszavonni vagy újrapróbálni.
A visszavonható és a véglegesített közötti határ azt jelenti, hogy a kimutatástranzakció lehet az utolsó visszavonható vagy kompenzálható tranzakció. Vagy ez lehet a saga első újrapróbálkozási művelete.
újrapróbálkozható tranzakciók követni a kimutatást. Az újrapróbálkozható tranzakciók idempotensek, és segítenek biztosítani, hogy a saga elérje a végleges állapotát, még akkor is, ha átmeneti hibák történnek. Segítenek a saga végül elérni a konzisztens állapotot.
A Saga implementálási megközelítései
A két tipikus saga megvalósítási megközelítés koreográfiai és vezénylési. 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áfiával minden helyi tranzakció olyan tartományi eseményeket tesz közzé, amelyek helyi tranzakciókat váltanak ki más szolgáltatásokban.
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 veszélye annak, hogy a saga résztvevői ciklikus függőséget jelentenek, mert egymás parancsait kell használniuk. |
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és előnyei | A vezénylés 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 üzenetfeldolgozási.
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.
Dirty olvas: Amikor egy saga vagy tranzakció olyan adatokat olvas be, amelyeket egy másik saga módosított, de a módosítás 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: Alkalmazásszintű zárolások használata, ha egy saga kompenzálható tranzakciója egy szemaphore használatával jelzi, hogy a 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 vagy kompenzálnia kell, ha a sorozat 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
Kapcsolódó erőforrások
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 megszakító minta kezeli azokat a hibákat, amelyekből változó ideig tart a helyreállítás, 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.