Kompenzáló tranzakció mintája

Azure

Ha egy végül konzisztens, több lépésből álló műveletet használ, a kompenzáló tranzakció minta hasznos lehet. Pontosabban, ha egy vagy több lépés meghiúsul, a kompenzáló tranzakció mintával visszavonhatja a lépések által végrehajtott munkát. Általában olyan műveleteket talál, amelyek a végleges konzisztenciamodellt követik a felhőalapú alkalmazásokban, amelyek összetett üzleti folyamatokat és munkafolyamatokat implementálnak.

Kontextus és probléma

A felhőben futó alkalmazások gyakran módosítják az adatokat. Ezek az adatok néha különböző adatforrásokban, különböző földrajzi helyeken vannak elosztva. Az elosztott környezetben a versengés elkerülése és a teljesítmény javítása érdekében az alkalmazásnak nem az erős tranzakció-konzisztencia biztosítására kell törekednie. Ehelyett az alkalmazásnak a végleges konzisztenciát kell megvalósítania. A végleges konzisztenciamodellben egy tipikus üzleti művelet több különálló lépésből áll. Bár a művelet végrehajtja ezeket a lépéseket, a rendszerállapot általános nézete inkonzisztens lehet. Ha azonban a művelet befejeződik, és az összes lépés lefut, a rendszernek ismét konzisztenssé kell válnia.

Az Adatkonzisztencia alapozója tájékoztatást nyújt arról, hogy az elosztott tranzakciók miért nem skálázhatók megfelelően. Ez az erőforrás a végleges konzisztenciamodell alapelveit is felsorolja.

A végleges konzisztenciamodell egyik kihívása a sikertelen lépések kezelése. Egy hiba után előfordulhat, hogy vissza kell vonnia a művelet előző lépéseinek összes műveletét. Azonban nem mindig állíthatja vissza az adatokat, mert előfordulhat, hogy az alkalmazás más egyidejű példányai megváltoztatták azokat. Még azokban az esetekben is, amikor az egyidejű példányok nem módosították az adatokat, a lépések visszavonása összetettebb lehet, mint az eredeti állapot visszaállítása. Előfordulhat, hogy különböző üzletspecifikus szabályokat kell alkalmazni. Például tekintse meg a jelen cikk későbbi részében ismertetett utazási webhelyet.

Ha egy végleges konzisztenciát megvalósító művelet több heterogén adattárra is kiterjed, a művelet lépéseinek visszavonásához minden adattárat meg kell látogatni. Annak érdekében, hogy a rendszer ne maradjon inkonzisztens, megbízhatóan vissza kell vonnia az összes adattárban elvégzett munkát.

A végleges konzisztenciát megvalósító művelet által érintett adatok nem mindig egy adatbázisban lesznek tárolva. Vegyük például a szolgáltatásorientált architektúra (SOA) környezetét. Az SOA-műveletek meghívhatnak egy műveletet egy szolgáltatásban, és megváltoztathatják az adott szolgáltatás által birtokolt állapotot. A művelet visszavonásához ezt az állapotváltozást is vissza kell vonnia. Ez a folyamat magában foglalhatja a szolgáltatás ismételt meghívását és egy másik művelet végrehajtását, amely megfordítja az első hatását.

Megoldás

A megoldást egy kompenzáló tranzakció megvalósítása jelenti. A kompenzáló tranzakció lépései visszavonják az eredeti művelet lépéseinek hatásait. Intuitív módszer az aktuális állapot lecserélése arra az állapotra, amelyben a rendszer a művelet kezdetén volt. A kompenzáló tranzakciók azonban nem mindig tudják ezt a megközelítést alkalmazni, mert felülírhatják az alkalmazás más egyidejű példányai által végrehajtott módosításokat. Ehelyett a kompenzáló tranzakciónak intelligens folyamatnak kell lennie, amely figyelembe veszi az egyidejű példányok által végzett munkát. Ez a folyamat általában alkalmazásspecifikus, amelyet az eredeti művelet által végrehajtott munka jellege vezérel.

Gyakran alkalmazott megközelítés egy munkafolyamat segítségével megvalósítani egy végül konzisztens műveletet, amely esetében kompenzációra van szükség. Ahogy az eredeti művelet folytatódik, a rendszer rögzíti az egyes lépések adatait, beleértve a lépés által végzett munka visszavonását is. Ha a művelet bármikor meghiúsul, a munkafolyamat visszatekeri a végrehajtott lépéseket. A munkafolyamat minden lépésnél végrehajtja az adott lépést megfordító munkát.

Két fontos szempont:

  • Előfordulhat, hogy egy kompenzáló tranzakciónak nem kell visszavonnia a munkát az eredeti művelet pontos fordított sorrendjében.
  • Előfordulhat, hogy a visszavonási lépések egy részét párhuzamosan is végrehajthatja.

Ez a megközelítés hasonlít a Clemens Vasters blogjában tárgyalt Sagas-stratégiához.

A kompenzáló tranzakció maga egy végül konzisztens művelet, így az is meghiúsulhat. A rendszernek képesnek kell lennie a kompenzáló tranzakció helyreállítására az adott hibánál, majd folytatni a műveletet. Előfordulhat, hogy meg kell ismételnie egy sikertelen lépést, ezért a kompenzáló tranzakció lépéseit idempotens parancsokként kell meghatároznia. További információ: Idempotency Patterns on Jonathan Oliver's blog.

Bizonyos esetekben a manuális beavatkozás lehet az egyetlen módja a sikertelen lépések helyreállításának. Ilyen esetekben a rendszernek riasztást kell adnia, és a lehető legtöbb információt kell megadnia a hiba okáról.

Problémák és megfontolandó szempontok

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

  • Előfordulhat, hogy nem könnyű meghatározni, hogy egy végleges konzisztenciát megvalósító művelet egy lépése mikor meghiúsul. Előfordulhat, hogy egy lépés nem hiúsul meg azonnal. Ehelyett előfordulhat, hogy le lesz tiltva. Előfordulhat, hogy időtúllépési mechanizmust kell implementálnia.

  • Nem könnyű általánosítani a kompenzációs logikát. A kompenzáló tranzakció alkalmazásspecifikus. A meghiúsult művelet lépéseinek hatása akkor vonható vissza, ha az alkalmazás ehhez elegendő információval rendelkezik.

  • A kompenzáló tranzakción belüli lépéseket idempotens parancsokként kell meghatározni. Ha így tesz, a lépések megismételhetők, ha maga a kompenzáló tranzakció meghiúsul.

  • A lépéseket kezelő infrastruktúrának meg kell felelnie a következő feltételeknek:

    • Rugalmas az eredeti műveletben és a kompenzáló tranzakcióban.
    • Nem veszíti el a sikertelen lépések kompenzálásához szükséges információkat.
    • Megbízhatóan figyeli a kompenzációs logika előrehaladását.
  • A kompenzáló tranzakciók nem feltétlenül adják vissza a rendszeradatokat az eredeti művelet kezdetének állapotához. Ehelyett a tranzakció kompenzálja a művelet sikeres végrehajtása előtt elvégzett munkát.

  • A kompenzáló tranzakció lépéseinek sorrendje nem feltétlenül az eredeti művelet lépéseinek ellentéte. Az egyik adattár például érzékenyebb lehet az inkonzisztenciákra, mint a másikra. Először a kompenzáló tranzakció azon lépéseinek kell történnie, amelyek visszavonják a tár módosításait.

  • Bizonyos intézkedések növelhetik annak valószínűségét, hogy a teljes tevékenység sikeres legyen. Pontosabban egy rövid távú, időtúllépésen alapuló zárolást helyezhet el minden olyan erőforráson, amely a művelet végrehajtásához szükséges. Ezeket az erőforrásokat előre is beszerezheti. Ezután csak az összes erőforrás beszerzése után végezze el a munkát. Véglegesítse az összes műveletet, mielőtt a zárolások lejárnak.

  • A szokásosnál megbocsátóbb újrapróbálkozási logika segíthet minimalizálni a kompenzáló tranzakciót kiváltó hibákat. Ha egy végleges konzisztenciát megvalósító művelet egyik lépése meghiúsul, próbálja meg átmeneti kivételként kezelni a hibát, és megismételni a lépést. Állítsa le a műveletet, és csak akkor kezdeményezzen kompenzáló tranzakciót, ha egy lépés ismétlődően meghiúsul, vagy nem állítható helyre.

  • Kompenzáló tranzakció megvalósításakor számos olyan kihívással kell szembenéznie, mint a végleges konzisztencia megvalósításakor. További információt az Adatkonzisztencia-alapozó "Az végleges konzisztencia implementálásának szempontjai" című szakaszában talál.

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

Ezt a mintát csak olyan műveletek esetében javasolt használni, amelyeket a meghiúsulásuk esetén vissza kell vonni. Ha lehetséges, keressen olyan megoldásokat, amelyekkel elkerülhető a kompenzáló tranzakciók jelentette összetettség.

Számítási feladatok tervezése

Az építészeknek értékelniük kell, hogyan használható a kompenzáló tranzakciós minta a számítási feladatok tervezése során az Azure Well-Architected Framework pilléreiben foglalt célok és alapelvek kezelésére. Példa:

Pillér Hogyan támogatja ez a minta a pillércélokat?
A megbízhatósági tervezési döntések segítenek a számítási feladatnak ellenállóvá válni a hibás működéssel szemben, és biztosítani, hogy a hiba bekövetkezése után teljesen működőképes állapotba kerüljön. A kompenzációs műveletek olyan folyamatok használatával oldják meg a kritikus számítási feladatok elérési útjaiban fellépő hibákat, mint az adatváltozások közvetlen visszaállítása, a tranzakciózárolások feltörése vagy akár a natív rendszer viselkedésének végrehajtása a hatás megfordítása érdekében.

- RE:02 Kritikus folyamatok
- RE:09 Vészhelyreállítás

Mint minden tervezési döntésnél, fontolja meg az ezzel a mintával bevezethető többi pillér céljaival szembeni kompromisszumokat.

Példa

Az ügyfelek utazási webhelyet használnak az útvonalfoglaláshoz. Egyetlen útvonal több járatból és szállodából állhat. Egy Seattle-ből Londonba, majd Párizsba utazó ügyfél az alábbi lépéseket hajthatja végre egy útvonal létrehozásakor:

  1. Helyet foglal a Seattle-ből Londonba tartó F1 repülőjáratra.
  2. Helyet foglal a Londonból Párizsba tartó F2 repülőjáratra.
  3. Helyet foglal a Párizsból Seattle-be tartó F3 repülőjáratra.
  4. Szobát foglal a londoni H1 szállodában.
  5. Szobát foglal a párizsi H2 szállodában.

Ezek a lépések egy végül konzisztens műveletet alkotnak, bár minden egyes lépés külön műveletet jelent. A lépések végrehajtása mellett a rendszernek az egyes lépések visszavonásához is rögzítenie kell a számlálóműveleteket. Erre az információra akkor van szükség, ha az ügyfél lemondja az útvonaltervet. A számlálóműveletek végrehajtásához szükséges lépések ezután kompenzáló tranzakcióként futtathatók.

Előfordulhat, hogy a kompenzáló tranzakció lépései nem feltétlenül ellentétesek az eredeti lépésekkel. Emellett a kompenzáló tranzakció minden lépésének logikájának figyelembe kell vennie az üzletspecifikus szabályokat. Előfordulhat például, hogy a repülőjegy-foglalás lemondása nem jogosítja fel az ügyfelet a teljes visszatérítésre.

Az alábbi ábra egy hosszú ideig futó tranzakció lépéseit mutatja be egy utazási útvonal lefoglalásához. Láthatja a kompenzáló tranzakció lépéseit is, amelyek visszavonják a tranzakciót.

Diagram that shows the steps for creating an itinerary. The steps of the compensating transaction that cancels the itinerary are also shown.

Feljegyzés

A kompenzáló tranzakció lépéseit párhuzamosan is végrehajthatja attól függően, hogy hogyan tervezi meg az egyes lépések kompenzáló logikáját.

Számos üzleti megoldásban az egyetlen lépés meghiúsulása nem mindig teszi szükségessé a rendszer visszaállítását kompenzáló tranzakció használatával. Vegyük például az utazási webhely forgatókönyvét. Tegyük fel, hogy az ügyfél F1, F2 és F3 járatokat foglal le, de nem tud szobát foglalni a H1 szállodában. Jobb, ha az ügyfélnek egy szobát kínál egy másik szállodában ugyanabban a városban, ahelyett, hogy lemondja a járatokat. Az ügyfél továbbra is dönthet a lemondás mellett. Ebben az esetben a kompenzáló tranzakció lefut, és visszavonja az F1, F2 és F3 járatok foglalásait. De az ügyfélnek ezt a döntést kell hoznia, nem a rendszert.

Következő lépések

  • Adatkonzisztencia – Ismertető. A Kompenzáló tranzakció mintája gyakran használják olyan műveletek visszavonásához, amelyek a végleges konzisztenciájú modell megvalósítását szolgálják. Ez az alapozó információt nyújt a végleges konzisztencia előnyeiről és kompromisszumairól.
  • Idempotencia-minták. Kompenzáló tranzakció esetén a legjobb, ha idempotens parancsokat használ. Ez a blogbejegyzés az idempotencia megvalósítása során figyelembe veendő tényezőket ismerteti.
  • Scheduler Agent Supervisor minta. Ez a cikk azt ismerteti, hogyan valósíthat meg rugalmas rendszereket, amelyek elosztott szolgáltatásokat és erőforrásokat használó üzleti műveleteket hajtanak végre. Ezekben a rendszerekben néha kompenzáló tranzakciót kell használnia a művelet által végzett munka visszavonásához.
  • Újrapróbálkozási minta. A kompenzáló tranzakciók számításilag igényesek lehetnek. Az Újrapróbálkozási minta használatával megpróbálhatja minimalizálni a használatukat a sikertelen műveletek újrapróbálkozási szabályzatának implementálásához.
  • Saga elosztott tranzakciók mintája. Ez a cikk azt ismerteti, hogyan kezelheti a Saga-mintát az elosztott tranzakciós forgatókönyvekben lévő mikroszolgáltatások adatkonzisztenciájának kezelésére. A Saga-minta kompenzáló tranzakciókkal kezeli a sikertelen helyreállítást.
  • Csövek és szűrők mintája. Ez a cikk a Csövek és szűrők mintát ismerteti, amellyel egy összetett feldolgozási feladatot újrahasználható elemek sorozatává bonthat. A Csövek és szűrők mintát használhatja a kompenzáló tranzakció mintával az elosztott tranzakciók implementálásának alternatívájaként.
  • Tervezzen az önjavítást szem előtt tartva. Ez az útmutató bemutatja, hogyan tervezhet öngyógyító alkalmazásokat. Öngyógyító megközelítés részeként kompenzáló tranzakciókat is használhat.