Share via


Azure Functions megbízható eseményfeldolgozás

Az eseményfeldolgozás a kiszolgáló nélküli architektúra egyik leggyakoribb forgatókönyve. Ez a cikk azt ismerteti, hogyan hozhat létre megbízható üzenetfeldolgozót Azure Functions az üzenetek elvesztésének elkerülése érdekében.

Az eseménystreamek kihívásai az elosztott rendszerekben

Vegyünk egy olyan rendszert, amely másodpercenként 100 esemény állandó sebességgel küld eseményeket. Ebben az ütemben perceken belül több párhuzamos Functions-példány másodpercenként felhasználhatja a bejövő 100 eseményt.

A következő, kevésbé optimális feltételek bármelyike lehetséges:

  • Mi történik, ha az esemény közzétevője sérült eseményt küld?
  • Mi történik, ha a Functions-példány kezeletlen kivételeket tapasztal?
  • Mi történik, ha egy alsóbb rétegbeli rendszer offline állapotba kerül?

Hogyan kezeli ezeket a helyzeteket, miközben megőrzi az alkalmazás átviteli sebességét?

Az üzenetsorok esetében a megbízható üzenetküldés természetesen jön. Függvény-eseményindítóval párosítva a függvény zárolja az üzenetsort. Ha a feldolgozás sikertelen, a zárolás felszabadul, hogy egy másik példány újrapróbálkozhasson a feldolgozáshoz. A feldolgozás ezután mindaddig folytatódik, amíg az üzenet kiértékelése sikeresen meg nem történik, vagy a rendszer hozzáadja azt egy méregsorhoz.

Még ha egyetlen üzenetsor-üzenet is újrapróbálkozási ciklusban marad, a többi párhuzamos végrehajtás továbbra is megőrzi a fennmaradó üzenetek törlését. Ennek az az eredménye, hogy az általános átviteli sebességet egy rossz üzenet nem befolyásolja. A tárolási üzenetsorok azonban nem garantálják a rendelést, és nem az Event Hubs által igényelt magas átviteli sebességre optimalizálják.

Ezzel szemben Azure Event Hubs nem tartalmaz zárolási fogalmat. Az Event Hubs-események úgy viselkednek, mint egy videolejátszó, hogy lehetővé tegyék az olyan funkciók használatát, mint a nagy átviteli sebesség, a több fogyasztói csoport és a visszajátszási képesség. Az eseményeket a rendszer a stream partíciónkénti egyetlen pontjáról olvassa be. Az egérmutatóról előre vagy hátra is olvashat erről a helyről, de az események feldolgozásához át kell helyeznie a mutatót.

Ha hiba történik egy streamben, ha úgy dönt, hogy a mutatót ugyanazon a helyen tartja, az eseményfeldolgozás le lesz tiltva, amíg a mutató fejlett nem lesz. Más szóval, ha az egérmutató leáll egy esemény feldolgozásának problémáival, a feldolgozatlan események elkezdenek felborulni.

Azure Functions elkerülheti a holtpontok elkerülését a stream mutatójának sikerességétől vagy meghibásodásától függetlenül. Mivel a mutató folyamatosan halad, a függvényeknek megfelelően kell kezelnie a hibákat.

Az Event Hubs-események Azure Functions felhasználása

Azure Functions a következő lépések végrehajtásával használja fel az Event Hub-eseményeket:

  1. Az eseményközpont minden partíciója esetében létrejön és megmarad egy mutató az Azure Storage-ban.
  2. Amikor új üzenetek érkeznek (alapértelmezés szerint egy kötegben), a gazdagép megpróbálja aktiválni a függvényt az üzenetköteggel.
  3. Ha a függvény végrehajtja a végrehajtást (kivétellel vagy kivétel nélkül), a mutató előrelép, és egy ellenőrzőpontot ment a tárfiókba.
  4. Ha a feltételek megakadályozzák a függvény végrehajtását, a gazdagép nem tudja végrehajtani a mutatót. Ha az egérmutató nem fejlett, akkor a későbbi ellenőrzések ugyanazokat az üzeneteket dolgozják fel.
  5. Ismételje meg a 2–4. lépést

Ez a viselkedés néhány fontos pontot mutat be:

Kivételek kezelése

Általános szabály, hogy minden függvénynek tartalmaznia kell egy try/catch blokkot a kód legmagasabb szintjén. Pontosabban az Event Hubs-eseményeket használó összes függvénynek blokkot catch kell használnia. Így kivétel esetén a fogási blokk kezeli a hibát, mielőtt a mutató továbbhalad.

Újrapróbálkozások mechanizmusai és szabályzatai

Egyes kivételek átmeneti jellegűek, és nem jelennek meg újra, ha egy műveletet néhány perccel később újra megkísérlnek. Ezért az első lépés mindig a művelet újrapróbálkozása. Használhatja a függvényalkalmazás újrapróbálkozási szabályzatát , vagy létrehozhat újrapróbálkozási logikát a függvény végrehajtásán belül.

A függvények hibakezelési viselkedésének bevezetésével alapszintű és speciális újrapróbálkozási szabályzatokat is definiálhat. Implementálhat például egy olyan szabályzatot, amely a következő szabályokkal illusztrált munkafolyamatot követi:

  • Próbáljon meg háromszor beszúrni egy üzenetet (ami az újrapróbálkozások közötti késéssel járhat).
  • Ha az összes újrapróbálkozás végső eredménye sikertelen, adjon hozzá egy üzenetet egy üzenetsorhoz, hogy a feldolgozás folytatódjon a streamben.
  • A sérült vagy feldolgozatlan üzeneteket később kezeli a rendszer.

Megjegyzés

A Polly egy példa a C#-alkalmazások rugalmasságára és átmeneti hibakezelési kódtárára.

Kivétel nélküli hibák

Bizonyos problémák akkor is felmerülnek, ha nem jelenik meg hiba. Vegyük például azt a hibát, amely egy végrehajtás közepén következik be. Ebben az esetben, ha egy függvény végrehajtása nem fejeződik be, az eltolásmutató soha nem halad. Ha az egérmutató nem halad előre, akkor a sikertelen végrehajtás után futó példányok továbbra is ugyanazokat az üzeneteket olvassák. Ez a helyzet "legalább egyszer" garanciát nyújt.

Az a biztosíték, hogy minden üzenet feldolgozása legalább egy alkalommal történik, azt jelenti, hogy egyes üzenetek több alkalommal is feldolgozhatók. A függvényalkalmazásainak tisztában kell lenniük ezzel a lehetőséggel, és az idempotencia alapelveire kell épülniük.

Végrehajtás leállítása és újraindítása

Bár néhány hiba elfogadható lehet, mi történik, ha az alkalmazás jelentős hibákat tapasztal? Érdemes lehet leállítani az eseményindítót, amíg a rendszer nem éri el az kifogástalan állapotot. A feldolgozás szüneteltetésére való lehetőség gyakran áramkör-megszakító mintával érhető el. Az áramkör-megszakító minta lehetővé teszi, hogy az alkalmazás "megszakítsa" az eseményfolyamat áramkörét, és később folytatódjon.

Az áramkör-megszakító eseményfolyamatban való implementálásához két részre van szükség:

  • Megosztott állapot az összes példányban a kapcsolatcsoport állapotának nyomon követéséhez és monitorozásához
  • Főfolyamat, amely képes kezelni a kapcsolatcsoport állapotát (nyitott vagy zárt)

A megvalósítás részletei eltérőek lehetnek, de az állapot példányok közötti megosztásához szükség van egy tárolási mechanizmusra. Dönthet úgy, hogy az állapotot az Azure Storage-ban, a Redis-gyorsítótárban vagy bármely más, függvénygyűjtemény által elérhető fiókban tárolja.

Az Azure Logic Apps vagy a tartós függvények természetes illeszkedés a munkafolyamat és a kapcsolatcsoport állapotának kezeléséhez. Más szolgáltatások is működhetnek, de ebben a példában logikai alkalmazásokat használunk. Logikai alkalmazások használatával szüneteltetheti és újraindíthatja a függvények végrehajtását, így az áramkör-megszakító minta implementálásához szükséges vezérlőt használhatja.

Hibaküszöb meghatározása a példányok között

Ha egyszerre több példányt szeretne feldolgozni, a kapcsolatcsoport állapotának figyeléséhez meg kell őrizni a megosztott külső állapotot.

Egy implementálási szabály kényszerítheti a következőt:

  • Ha 30 másodpercen belül több mint 100 hiba történt az összes példányon, akkor megszakíthatja a kapcsolatcsoportot, és leállítja az új üzenetek aktiválását.

A megvalósítás részletei az igényeitől függően eltérőek lesznek, de általában olyan rendszert hozhat létre, amely:

  1. Tárfiók naplóhibái (Azure Storage, Redis stb.)
  2. Új hiba naplózásakor vizsgálja meg a gördülési számot, és ellenőrizze, hogy teljesül-e a küszöbérték (például 100-nál több az elmúlt 30 másodpercben).
  3. Ha a küszöbérték teljesül, eseményt bocsát ki, amely Azure Event Grid jelzi a rendszernek, hogy megszakítsa a kapcsolatcsoportot.

Kapcsolatcsoport állapotának kezelése az Azure Logic Appsszel

Az alábbi leírás egy olyan módszert mutat be, amellyel azure-beli logikai alkalmazást hozhat létre a Functions-alkalmazások feldolgozásának leállításához.

Az Azure Logic Apps beépített összekötőkkel rendelkezik a különböző szolgáltatásokhoz, állapotalapú vezényléseket tartalmaz, és természetes választás a kapcsolatcsoport állapotának kezeléséhez. Miután észlelte, hogy a kapcsolatcsoportnak megszakadnia kell, létrehozhat egy logikai alkalmazást a következő munkafolyamat implementálásához:

  1. Event Grid-munkafolyamat aktiválása és az Azure-függvény leállítása (az Azure Resource-összekötővel)
  2. Értesítési e-mail küldése, amely tartalmazza a munkafolyamat újraindításának lehetőségét

Az e-mail címzettje megvizsgálhatja a kapcsolatcsoport állapotát, és szükség esetén újraindíthatja a kapcsolatcsoportot az értesítési e-mailben található hivatkozáson keresztül. Amikor a munkafolyamat újraindítja a függvényt, a rendszer az utolsó Event Hub ellenőrzőpontról dolgozza fel az üzeneteket.

Ezzel a módszerrel nem vesznek el üzenetek, az összes üzenet feldolgozása sorrendben történik, és szükség esetén megszakíthatja a kapcsolatcsoportot.

Források

Következő lépések

További információkat találhat az alábbi forrásokban: