Koreográfiai minta

Azure Event Grid
Azure Service Bus

Decentralizált munkafolyamat-logika és a felelősségek elosztása a rendszer más összetevői között.

Kontextus és probléma

A felhőalapú alkalmazásokat gyakran több kisebb szolgáltatásra osztják, amelyek együttműködnek egy üzleti tranzakció végpontok közötti feldolgozásában. Egyetlen művelet (egy tranzakción belül) is több pont–pont híváshoz vezethet az összes szolgáltatás között. Ideális esetben ezeket a szolgáltatásokat lazán kell összekapcsolni. Nehéz olyan munkafolyamatot tervezni, amely elosztott, hatékony és méretezhető, mert gyakran összetett szolgáltatásközi kommunikációt igényel.

A kommunikáció gyakori mintája egy központosított szolgáltatás vagy vezénylő használata. A bejövő kérések a vezénylőn keresztül áramlanak, miközben a műveletet az adott szolgáltatásoknak delegálja. Minden szolgáltatás csak teljesíti a felelősséget, és nem ismeri a teljes munkafolyamatot.

A kéréseket központi vezénylővel feldolgozó munkafolyamat diagramja.

A vezénylési minta általában egyéni szoftverként van implementálva, és rendelkezik tartományismeretekkel ezen szolgáltatások feladataival kapcsolatban. Ennek előnye, hogy a vezénylő összevonhatja egy tranzakció állapotát az alárendelt szolgáltatások által végrehajtott egyedi műveletek eredményei alapján.

Vannak azonban hátrányai. A szolgáltatások hozzáadása vagy eltávolítása megszakíthatja a meglévő logikát, mert újra kell húznia a kommunikációs útvonal egyes részeit. Ez a függőség összetettebbé és nehezen karbantarthatóvá teszi a vezénylő implementációt. A vezénylő negatív hatással lehet a számítási feladat megbízhatóságára. Terhelés esetén teljesítménybeli szűk keresztmetszetet okozhat, és egyetlen meghibásodási pont lehet. Kaszkádolt hibákat is okozhat az alsóbb rétegbeli szolgáltatásokban.

Megoldás

Delegálja a tranzakciókezelési logikát a szolgáltatások között. Hagyja, hogy minden szolgáltatás döntsön és vegyen részt egy üzleti művelet kommunikációs munkafolyamatában.

A minta a kommunikációs munkafolyamatot központosító egyéni szoftverekkel való függőség minimalizálásának módja. Az összetevők közös logikát valósítanak meg, mivel egymás között koreografálják a munkafolyamatot anélkül, hogy közvetlen kommunikációt folytatnának egymással.

A koreográfia implementálásának gyakori módja egy üzenetközvetítő használata, amely puffereli a kéréseket, amíg az alsóbb rétegbeli összetevők nem igényelnek és dolgozzák fel őket. A képen egy közzétevő-előfizetői modellen keresztüli kérelmek kezelése látható.

Egy kérés üzenetközvetítővel történő feldolgozását bemutató diagram.

  1. Az ügyfélkérések üzenetsorba kerülnek egy üzenetközvetítőben.

  2. A szolgáltatások vagy az előfizető lekérdezi a közvetítőt annak megállapításához, hogy képesek-e feldolgozni ezt az üzenetet a megvalósított üzleti logikájuk alapján. A közvetítő üzeneteket is küldhet az üzenet iránt érdeklődő előfizetőknek.

  3. Minden előfizetett szolgáltatás az üzenetben jelzett módon végzi a műveletet, és a művelet sikerességével vagy sikertelenségével válaszol a közvetítőnek.

  4. Ha sikeres, a szolgáltatás vissza tud küldeni egy üzenetet ugyanahhoz az üzenetsorhoz vagy egy másik üzenetsorhoz, hogy szükség esetén egy másik szolgáltatás is folytathassa a munkafolyamatot. Ha a művelet meghiúsul, az üzenetközvetítő más szolgáltatásokkal együttműködve kompenzálja a műveletet vagy a teljes tranzakciót.

Problémák és megfontolandó szempontok

A vezénylő decentralizálása problémákat okozhat a munkafolyamat kezelése során.

  • Az átadási hibák kihívást jelenthetnek. Az alkalmazás összetevői atomi feladatokat végezhetnek, de még mindig függőségi szinttel rendelkezhetnek. Az egyik összetevő meghibásodása másokat is érinthet, ami késést okozhat a teljes kérés teljesítésében.

    A hibák kecses kezelése érdekében a kompenzáló tranzakciók implementálása összetettséget eredményezhet.

    Folyamatábra, amely hibakezelést mutat a koreográfiai mintában.

  • A minta olyan munkafolyamatokhoz használható, ahol a független üzleti műveleteket párhuzamosan dolgozzák fel. A munkafolyamat bonyolulttá válhat, ha a koreográfiának sorozatban kell történnie. A D szolgáltatás például csak akkor indíthatja el a műveletet, ha a B szolgáltatás és a C szolgáltatás sikeresen végrehajtotta a műveleteit.

    Egy üzenetkezelési rendszer munkafolyamatának diagramja, amely párhuzamosan és később implementálja a koreográfiai mintát.

  • A minta kihívást jelent, ha a szolgáltatások száma gyorsan növekszik. A független mozgó részek nagy száma miatt a szolgáltatások közötti munkafolyamat összetettebb lesz. Az elosztott nyomkövetés is nehézkessé válik.

  • A vezénylő által vezetett kialakításban a központi összetevő részben részt vehet, és delegálhatja a rugalmassági logikát egy másik összetevőre, amely folyamatosan újrapróbálkozza az átmeneti, nem átmeneti és időtúllépési hibákat. A koreográfiai mintában a vezénylő feloszlásával az alsóbb rétegbeli összetevőknek nem szabad felvennie ezeket a rugalmassági feladatokat. Ezeket továbbra is a rugalmasságkezelőnek kell kezelnie. Most azonban az alsóbb rétegbeli összetevőknek közvetlenül kommunikálniuk kell a rugalmasságkezelővel, növelve a pont–pont kommunikációt.

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

Használja ezt a mintát, ha:

  • Az alsóbb rétegbeli összetevők egymástól függetlenül kezelik az atomi műveleteket. Gondolj rá úgy, mint egy "tűz és felejtés" mechanizmus. Az összetevők olyan feladatokért felelősek, amelyeket nem kell aktívan felügyelni. Ha a feladat befejeződött, értesítést küld a többi összetevőnek.

  • Az összetevőket várhatóan gyakran frissítik és cserélik. A minta lehetővé teszi az alkalmazás módosítását kevesebb erőfeszítéssel és a meglévő szolgáltatások minimális megszakításával.

  • A minta természetes illeszkedés az egyszerű munkafolyamatokhoz megfelelő kiszolgáló nélküli architektúrákhoz. Az összetevők lehetnek rövid élettartamúak és eseményvezéreltek. Esemény bekövetkezésekor az összetevők felpörögnek, végrehajtják a feladataikat, és eltávolítják őket a feladat befejezése után.

  • A központi vezénylő teljesítménybeli szűk keresztmetszetet mutat be.

Nem érdemes ezt a mintát használni, ha:

  • Az alkalmazás összetett, és egy központi összetevőt igényel a megosztott logika kezeléséhez az alsóbb rétegbeli összetevők egyszerűségéhez.

  • Vannak olyan helyzetek, amikor az összetevők közötti pont–pont kommunikáció elkerülhetetlen.

  • Az alsóbb rétegbeli összetevők által kezelt összes műveletet össze kell egyesítenie az üzleti logika használatával.

Számítási feladatok tervezése

Az építészeknek értékelniük kell, hogy a koreográfiai minta hogyan használható a számítási feladat kialakításában 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?
Az operatív kiválóság szabványosított folyamatok és a csapat kohéziója révén segít a számítási feladatok minőségének biztosításában. Mivel a mintában szereplő elosztott összetevők autonómak és cserélhetők, a számítási feladatot a rendszer kevésbé általános módosításával módosíthatja.

- OE:04 Eszközök és folyamatok
A teljesítményhatékonyság a skálázás, az adatok és a kód optimalizálásával segíti a számítási feladatok hatékony kielégítését . Ez a minta alternatívát kínál, ha egy központi vezénylési topológiában teljesítménybeli szűk keresztmetszetek lépnek fel.

- PE:02 Kapacitástervezés
- PE:05 Skálázás és particionálá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

Ez a példa egy eseményvezérelt, natív felhőbeli számítási feladat és mikroszolgáltatások létrehozásával mutatja be a koreográfiai mintát. Amikor egy ügyfél egy csomag szállítását kéri, a számítási feladat egy drónt rendel hozzá. Ha a csomag készen áll az ütemezett drón általi átvételre, a kézbesítési folyamat elindul. Átvitel közben a számítási feladat kezeli a kézbesítést, amíg meg nem nyeri a kiszállított állapotot.

Ez a példa a Drone Delivery implementáció újrabontása, amely az Orchestrator-mintát a koreográfiai mintával helyettesíti.

Eseményvezérelt felhőbeli natív példamunkaterhelés ábrázolása koreográfiai mintát implementálva

A Betöltési szolgáltatás kezeli az ügyfélkéréseket, és üzenetekké alakítja őket, beleértve a kézbesítési adatokat is. Az üzleti tranzakciók az új üzenetek felhasználása után indulnak el.

Egyetlen ügyfél üzleti tranzakcióhoz három különböző üzleti művelet szükséges:

  1. Csomag létrehozása vagy frissítése
  2. Drón hozzárendelése a csomag kézbesítéséhez
  3. Kezelje a szállítást, amely az ellenőrzésből és a szállításkor a tudatosság növeléséből áll.

Három mikroszolgáltatás végzi az üzleti feldolgozást: Csomag, Drónütemező és Kézbesítési szolgáltatások. Központi vezénylő helyett a szolgáltatások üzenetküldéssel kommunikálnak egymás között. Minden szolgáltatás feladata egy olyan protokoll előzetes implementálása, amely decentralizált módon koordinálja az üzleti munkafolyamatot.

Tervezés

Az üzleti tranzakció több ugrással, sorozatban lesz feldolgozva. Minden ugrás egyetlen üzenetbuszt oszt meg az összes üzleti szolgáltatás között.

Amikor egy ügyfél egy HTTP-végponton keresztül küld kézbesítési kérelmet, a Betöltési szolgáltatás megkapja, üzenetté alakítja az ilyen kérést, majd közzéteszi az üzenetet a megosztott üzenetbuszon. Az előfizetett üzleti szolgáltatások új üzeneteket használnak majd fel a buszhoz. Az üzenet fogadása után az üzleti szolgáltatások sikerrel, hibával vagy időtúllépéssel fejezhetik be a műveletet. Ha sikeres, a szolgáltatások az Ok állapotkóddal válaszolnak a buszra, új műveleti üzenetet küldenek, és elküldik az üzenetbusznak. Ha hiba vagy időtúllépés történt, a szolgáltatás az okkód üzenetbuszra küldésével jelenti a hibát. Emellett az üzenet egy kézbesítetlen üzenetsorhoz is hozzáadódik. Az ésszerű és megfelelő időn belül nem fogadható vagy feldolgozható üzeneteket a DLQ is áthelyezi.

A terv több üzenetbuszt használ a teljes üzleti tranzakció feldolgozásához. A Microsoft Azure Service Bus és a Microsoft Azure Event Grid úgy áll össze, hogy az üzenetkezelési szolgáltatási platformot biztosítsa ehhez a kialakításhoz. A számítási feladat üzembe helyezése az Azure Functionst üzemeltető Azure Container Appsbentörténik a betöltéshez, és az üzleti logikát végrehajtó eseményvezérelt feldolgozást kezelő alkalmazások.

A kialakítás biztosítja, hogy a koreográfia sorozatban történjen. Egyetlen Azure Service Bus-névtér tartalmaz egy témakört két előfizetéssel és egy munkamenet-tudatos üzenetsorsal. A Betöltési szolgáltatás üzeneteket tesz közzé a témakörben. A Csomagszolgáltatás és a Drone Scheduler szolgáltatás feliratkozik a témakörre, és közzéteszi az üzenetsor sikerét jelző üzeneteket. A kézbesítési azonosítóhoz társított GUID azonosítóval együtt a munkamenet-azonosító lehetővé teszi a kapcsolódó üzenetek kötetlen sorozatainak rendezett kezelését. A kézbesítési szolgáltatás tranzakciónként két kapcsolódó üzenetet vár. Az első üzenet azt jelzi, hogy a csomag készen áll a szállításra, a második pedig azt jelzi, hogy egy drón van ütemezve.

Ez a kialakítás az Azure Service Bus használatával kezeli azokat a nagy értékű üzeneteket, amelyeket a teljes kézbesítési folyamat során nem lehet elveszni vagy duplikálni. A csomag kiszállítása után az állapotváltozást is közzéteszi az Azure Event Gridre. Ebben a kialakításban az esemény feladójának nincs elvárása az állapotváltozás kezelésével kapcsolatban. A jelen terv részeként nem szereplő alárendelt szervezeti szolgáltatások figyelhetik ezt az eseménytípust, és reagálhatnak egy adott üzleti célú logika végrehajtására (azaz e-mailben elküldhetik a kiszállított rendelés állapotát a felhasználónak).

Ha ezt egy másik számítási szolgáltatásban, például az AKS pub-sub mintaalkalmazás-forrásplatformban tervezi üzembe helyezni, két tárolóval is implementálható ugyanabban a podban. Az egyik tároló futtatja azt a nagykövetet , aki a kívánt üzenetbuszt használja, míg a másik végrehajtja az üzleti logikát. Az ugyanabban a podban található két tároló megközelítése javítja a teljesítményt és a méretezhetőséget. A nagykövet és az üzleti szolgáltatás ugyanazzal a hálózattal rendelkezik, ami alacsony késést és nagy átviteli sebességet tesz lehetővé.

Az olyan kaszkádolt újrapróbálkozási műveletek elkerülése érdekében, amelyek több erőfeszítést is eredményezhetnek, az üzleti szolgáltatásoknak azonnal meg kell jelölnie az elfogadhatatlan üzeneteket. Az ilyen üzeneteket jól ismert okkódokkal vagy egy definiált alkalmazáskóddal bővítheti, így áthelyezhető egy kézbesítetlen levélsorba (DLQ). Fontolja meg a Saga alárendelt szolgáltatásokból való implementálásával kapcsolatos konzisztenciaproblémák kezelését. Egy másik szolgáltatás például csak kompenzációs, retyi vagy kimutatástranzakció végrehajtásával képes kezelni a kézbesítetlen levelű üzeneteket szervizelés céljából.

Az üzleti szolgáltatások idempotensek, hogy az újrapróbálkozási műveletek ne eredményezhessenek ismétlődő erőforrásokat. A Csomagszolgáltatás például upsert műveleteket használ az adatok adattárba való hozzáadásához.

Vegye figyelembe ezeket a mintákat a koreográfia tervezésében.