Megosztás a következőn keresztül:


Szabályozási problémák kezelése (429 – "Túl sok kérés" hiba) az Azure Logic Appsben

A következőkre vonatkozik: Azure Logic Apps (Használat + Standard)

Ha a logikai alkalmazás munkafolyamata szabályozást tapasztal, ami akkor fordul elő, ha a kérések száma meghaladja azt az arányt, amelyet a cél egy adott idő alatt képes kezelni, a "HTTP 429 Túl sok kérés" hibaüzenet jelenik meg. A szabályozás olyan problémákat okozhat, mint a késleltetett adatfeldolgozás, a csökkentett teljesítmény és olyan hibákat, mint a megadott újrapróbálkozási szabályzatban foglaltak túllépése.

Például egy használatalapú munkafolyamat alábbi SQL Server-művelete egy 429-re vonatkozó hibát jelenít meg, amely szabályozással kapcsolatos problémát jelez:

Képernyőkép egy 429-et tartalmazó SQL Server-művelettel rendelkező Használat munkafolyamatról.

A következő szakaszok azokat a gyakori szinteket ismertetik, amelyeken a munkafolyamat szabályozást tapasztalhat:

Logikai alkalmazás erőforrás-szabályozása

Az Azure Logic Apps saját átviteli sebességkorlátokkal rendelkezik. Ha a logikaialkalmazás-erőforrás túllépi ezeket a korlátokat, a logikai alkalmazás erőforrása szabályozva lesz, nem csak egy adott munkafolyamat-példány vagy futtatás.

Ha ezen a szinten szeretne szabályozni eseményeket, kövesse az alábbi lépéseket:

  1. Nyissa meg a logikai alkalmazás erőforrását az Azure Portalon.

  2. A logikai alkalmazás erőforrásmenüjének Figyelés területén válassza a Metrikák lehetőséget.

  3. A Diagram címe területen válassza a Metrika hozzáadása lehetőséget, amely egy másik metrikasávot ad hozzá a diagramhoz.

  4. Az első metrikasáv Metrika listájában válassza a Művelet szabályozása események lehetőséget. Az összesítési listából válassza a Darabszám lehetőséget.

  5. A második metrikasáv Metrika listájában válassza a Szabályozott események eseményindítója lehetőséget. Az összesítési listából válassza a Darabszám lehetőséget.

A diagram most már a logikai alkalmazás munkafolyamatában lévő műveletek és triggerek szabályozott eseményeit jeleníti meg. További információ: A munkafolyamat állapotának és teljesítményének mérőszámainak megtekintése az Azure Logic Appsben.

Ha ezen a szinten szeretné kezelni a szabályozást, a következő lehetőségek közül választhat:

  • Korlátozza az egyidejűleg futtatható munkafolyamat-példányok számát.

    Alapértelmezés szerint, ha a munkafolyamat triggerfeltétele egyszerre több alkalommal is teljesül, akkor az eseményindító több példánya is aktiválódik, és párhuzamosan vagy párhuzamosan fut. Minden eseményindító-példány az előző munkafolyamat-példány futtatása előtt aktiválódik.

    Bár az egyidejűleg futtatható eseményindító-példányok alapértelmezett száma korlátlan, ezt a számot korlátozhatja az eseményindító egyidejűségi beállításának bekapcsolásával, és szükség esetén válasszon egy, az alapértelmezett értéken kívüli korlátot.

  • Engedélyezze a nagy átviteli sebességet.

  • Tiltsa le a tömbök megszakítását vagy a "Felosztás bekapcsolva" viselkedést az eseményindítókban.

    Ha egy eseményindító egy tömböt ad vissza a fennmaradó munkafolyamat-műveletek feldolgozásához, az eseményindító Felosztása beállítás felosztja a tömbelemeket, és elindít egy munkafolyamat-példányt minden tömbelemhez. Ez a viselkedés hatékonyan aktivál több egyidejű futást a felosztási korlátig.

    A szabályozás szabályozásához kapcsolja ki az eseményindító Split On viselkedését, és a munkafolyamat egyetlen hívással dolgozza fel a teljes tömböt ahelyett, hogy egyetlen elemet kezelnél hívásonként.

  • Műveletek újrabontása több, kisebb munkafolyamatba.

    Ahogy korábban említettük, a Használat logikai alkalmazás munkafolyamata az alapértelmezett számú olyan műveletre korlátozódik, amely 5 perces időtartamon keresztül futtatható. Bár a magas átviteli sebesség engedélyezésével növelheti ezt a korlátot, megfontolhatja azt is, hogy a munkafolyamat műveleteit kisebb munkafolyamatokra szeretné-e bontani, hogy az egyes munkafolyamatokban futó műveletek száma a korlát alatt maradjon. Így csökkentheti egy munkafolyamat terheit, és több munkafolyamat között is eloszthatja a terhelést. Ez a megoldás jobban működik olyan műveleteknél, amelyek nagy adathalmazokat kezelnek, vagy olyan sok egyidejűleg futó műveletet, ciklus iterációt vagy műveletet hajtanak végre az egyes ciklus iterációkban, amelyek túllépik a művelet végrehajtási korlátját.

    Az alábbi használati munkafolyamat például elvégzi az összes olyan munkát, amely táblákat kér le egy SQL Server-adatbázisból, és lekéri az egyes táblák sorait. Az Egyes hurkok esetében az egyes táblák egyidejűleg haladnak végig, így a Sorok lekérése művelet az egyes táblák sorait adja vissza. A táblákban szereplő adatok mennyisége alapján ezek a műveletek meghaladhatják a műveletvégrehajtások korlátját.

    A Használat munkafolyamat

    Az újrabontás után az eredeti munkafolyamat egy szülő- és egy gyermek-munkafolyamatra lesz felosztva.

    A következő szülő munkafolyamat lekéri a táblákat az SQL Serverről, majd meghívja az egyes táblák gyermek munkafolyamatát a sorok lekéréséhez:

    Képernyőkép az SQL Server-táblákat lekérő és a gyermek munkafolyamatot meghívó Használat szülő munkafolyamatról.

    A szülő-munkafolyamat az alábbi gyermek munkafolyamatot hívja meg az egyes táblák sorainak lekéréséhez:

    Képernyőkép az egyes táblák sorait lekérő gyermek munkafolyamat használatról.

Összekötő szabályozása

Minden összekötő saját szabályozási korlátokkal rendelkezik, amelyeket az egyes összekötők műszaki referenciaoldalán talál. Az Azure Service Bus-összekötő például szabályozható korláttal rendelkezik, amely percenként legfeljebb 6000 hívást engedélyez, míg az SQL Server-összekötő a művelet típusától függően eltérő szabályozási korlátozásokkal rendelkezik.

Egyes eseményindítók és műveletek, például a HTTP olyan "újrapróbálkozási szabályzattal" rendelkeznek, amelyet az újrapróbálkozási szabályzat korlátai alapján testre szabhat a kivételkezelés implementálásához. Ez a szabályzat azt határozza meg, hogy egy eseményindító vagy művelet újrapróbálkozza-e a kérést, ha az eredeti kérés meghiúsul, vagy túllépi az időkorlátot, és 408, 429 vagy 5xx választ eredményez. Így amikor a szabályozás elindul, és 429-et ad vissza, a Logic Apps a támogatott újrapróbálkozási szabályzatot követi.

Ha tudni szeretné, hogy egy eseményindító vagy művelet támogatja-e az újrapróbálkozási szabályzatokat, ellenőrizze az eseményindító vagy a művelet beállításait. Egy eseményindító vagy művelet újrapróbálkozási kísérleteinek megtekintéséhez nyissa meg a logikai alkalmazás futtatási előzményeit, jelölje ki a megtekinteni kívánt futtatásokat, és bontsa ki az eseményindítót vagy műveletet a bemenetekkel, kimenetekkel és az újrapróbálkozások részleteinek megtekintésével.

Az alábbi Használati munkafolyamat-példa azt mutatja be, hogy hol található ez az információ egy HTTP-művelethez:

Képernyőkép egy HTTP-művelet futtatási előzményeiről, újrapróbálkozásokról, bemenetekről és kimenetekről.

Bár az újrapróbálkozási előzmények hibainformációkat tartalmaznak, előfordulhat, hogy problémákat tapasztal az összekötők szabályozása és a célszabályozás között. Ebben az esetben előfordulhat, hogy át kell tekintenie a válasz részleteit, vagy szabályozási időközi számításokat kell végrehajtania a forrás azonosításához.

A több-bérlős Azure Logic Apps használatalapú logikai alkalmazás-munkafolyamatai esetében a szabályozás a kapcsolat szintjén történik.

Ha ezen a szinten szeretné kezelni a szabályozást, a következő lehetőségek közül választhat:

  • Állítson be több kapcsolatot egyetlen művelethez, hogy a munkafolyamat particionálhassa az adatokat feldolgozás céljából.

    Fontolja meg, hogy eloszthatja-e a számítási feladatot úgy, hogy egy művelet kéréseit több kapcsolat között osztja el ugyanazon a célhelyen ugyanazzal a hitelesítő adatokkal.

    Tegyük fel például, hogy a munkafolyamat táblákat kér le egy SQL Server-adatbázisból, majd lekéri az egyes táblák sorait. A feldolgozandó sorok száma alapján több kapcsolattal és több ciklussal is feloszthatja a sorok teljes számát kisebb készletekre feldolgozásra. Ez a forgatókönyv két ciklust használ a sorok teljes számának felosztásához. Az első minden ciklushoz egy olyan kifejezést használ, amely az első felét kapja. A másik az egyes hurkokhoz egy másik kifejezést használ, amely a második felét kapja, például:

    • 1. kifejezés: A take() függvény egy gyűjtemény elejét kapja. További információkért tekintse meg a függvényttake().

      @take(collection-or-array-name, div(length(collection-or-array-name), 2))

    • 2. kifejezés: A skip() függvény eltávolítja a gyűjtemény elejét, és visszaadja az összes többi elemet. További információkért tekintse meg a függvénytskip().

      @skip(collection-or-array-name, div(length(collection-or-array-name), 2))

      Az alábbi Használati munkafolyamat-példa bemutatja, hogyan használhatja ezeket a kifejezéseket:

      Képernyőkép egy használatalapú munkafolyamatról, amely több kapcsolatot használ egyetlen művelethez.

  • Állítson be egy másik kapcsolatot minden művelethez.

    Fontolja meg, hogy eloszthatja-e a számítási feladatot úgy, hogy az egyes műveletek kéréseit a saját kapcsolatán keresztül terjeszti, még akkor is, ha a műveletek ugyanahhoz a szolgáltatáshoz vagy rendszerhez csatlakoznak, és ugyanazokat a hitelesítő adatokat használják.

    Tegyük fel például, hogy a munkafolyamat lekéri a táblákat egy SQL Server-adatbázisból, és lekéri az egyes táblák minden sorát. Külön kapcsolatokat is használhat, hogy a táblák lekérése egy kapcsolatot használjon, míg az egyes sorok lekérése egy másik kapcsolatot használjon.

    Az alábbi példa egy használati munkafolyamatot mutat be, amely minden művelethez más-más kapcsolatot hoz létre és használ:

    Képernyőkép egy használat munkafolyamatról, amely minden művelethez más-más kapcsolatot hoz létre és használ.

  • Módosítsa az egyidejűséget vagy a párhuzamosságot egy "Mindegyikhez" cikluson.

    Alapértelmezés szerint a "Minden" ciklus iterációja egyszerre fut az egyidejűségi korlátig. Ha olyan kapcsolattal rendelkezik, amely egy "Mindegyikhez" cikluson belül van szabályozva, csökkentheti a párhuzamosan futó hurkok iterációinak számát. További információkért tekintse meg a következő dokumentációt:

Célszolgáltatás vagy rendszerszabályozás

Bár az összekötő saját szabályozási korlátozásokkal rendelkezik, az összekötő által hívott célszolgáltatás vagy rendszer szabályozási korlátozásokkal is rendelkezhet. A Microsoft Exchange Server néhány API-jának például szigorúbb szabályozási korlátai vannak, mint az Office 365 Outlook-összekötőnek.

Alapértelmezés szerint a logikai alkalmazás munkafolyamat-példányai és a példányokon belüli hurkok vagy ágak párhuzamosan futnak. Ez a viselkedés azt jelenti, hogy egyszerre több példány is meghívhatja ugyanazt a végpontot. Minden példány nem tud a másik létezéséről, ezért a sikertelen műveletek újrapróbálkozása versenyfeltételeket teremthet, ahol egyszerre több hívás is fut, de a sikeresség érdekében ezeknek a hívásoknak meg kell érkezniük a célszolgáltatáshoz vagy rendszerhez, mielőtt a szabályozás elkezdődne.

Tegyük fel például, hogy van egy tömbje, amely 100 elemet tartalmaz. Az "Mindegyikhez" ciklussal végighaladhat a tömbön, és bekapcsolhatja a hurok egyidejűségi vezérlőjét, így a párhuzamos iterációk számát 20-ra vagy az aktuális alapértelmezett korlátra korlátozhatja. Ebben a ciklusban egy művelet beszúr egy elemet a tömbből egy SQL Server-adatbázisba, amely másodpercenként csak 15 hívást tesz lehetővé. Ez a forgatókönyv szabályozással kapcsolatos problémát okoz, mivel az újrapróbálkozások hátraléka létrejön, és soha nem lesz futtatható.

Az alábbi táblázat azt ismerteti, hogy mi történik a ciklusban, ha a művelet újrapróbálkozási időköze 1 másodperc:

Pont az időben Futtatott műveletek száma Sikertelen műveletek száma Várakozási újrapróbálkozések száma
T + 0 másodperc 20 beszúrás 5 hiba az SQL-korlát miatt 5 újrapróbálkozás
T + 0,5 másodperc 15 beszúrás, az előző 5 újrapróbálkozási várakozás miatt Mind a 15 sikertelen, mert a korábbi SQL-korlát még 0,5 másodpercig érvényben van 20 újrapróbálkozás
(előző 5 + 15 új)
T + 1 másodperc 20 beszúrás 5 feladat és az előző 20 újrapróbálkozás az SQL-korlát miatt 25 újrapróbálkozás (előző 20 + 5 új)

Ha ezen a szinten szeretné kezelni a szabályozást, a következő lehetőségek közül választhat:

  • Hozzon létre egyéni munkafolyamatokat, hogy mindegyik egyetlen műveletet kezeljen.

    • Az ebben a szakaszban szereplő PÉLDA SQL Server-forgatókönyvvel folytatva létrehozhat egy munkafolyamatot, amely tömbelemeket helyez egy üzenetsorba, például egy Azure Service Bus-üzenetsorba. Ezután létre kell hoznia egy másik munkafolyamatot, amely csak a beszúrási műveletet hajtja végre az üzenetsor minden egyes eleméhez. Így csak egy munkafolyamat-példány fut egy adott időpontban, amely vagy befejezi a beszúrási műveletet, és továbblép az üzenetsor következő elemére, vagy a példány 429-es hibát kap, de nem kísérel meg eredménytelen újrapróbálkozási kísérleteket.

    • Hozzon létre egy szülő-munkafolyamatot, amely minden művelethez meghív egy gyermek- vagy beágyazott munkafolyamatot. Ha a szülőnek a szülő kimenete alapján különböző gyermek-munkafolyamatokat kell meghívnia, használhat egy feltételműveletet, vagy válthat olyan műveletet, amely meghatározza, hogy melyik gyermek munkafolyamatot hívja meg. Ez a minta segíthet csökkenteni a hívások vagy műveletek számát.

      Tegyük fel például, hogy két munkafolyamattal rendelkezik, amelyek mindegyike egy lekérdezési eseményindítóval rendelkezik, amely percenként ellenőrzi az e-mail-fiókját egy adott témához, például a "Sikeres" vagy a "Sikertelen" témához. Ez a beállítás óránként 120 hívást eredményez. Ehelyett, ha egyetlen szülő munkafolyamatot hoz létre, amely percenként kérdez le, de meghív egy gyermek munkafolyamatot, amely a "Sikeres" vagy a "Sikertelen" téma alapján fut, akkor a lekérdezési ellenőrzések számát a felére, ebben az esetben pedig 60-ra csökkentette.

  • Kötegelt feldolgozás beállítása. (Csak használati munkafolyamatok)

    Ha a célszolgáltatás támogatja a kötegműveleteket, a szabályozást nem egyenként, hanem csoportokban vagy kötegekben lévő elemek feldolgozásával kezelheti. A kötegfeldolgozási megoldás implementálásához létre kell hoznia egy "batch receiver" logikaialkalmazás-munkafolyamatot és egy "batch sender" logikai alkalmazás munkafolyamatot. A köteg feladója addig gyűjti az üzeneteket vagy elemeket, amíg a megadott feltételek meg nem teljesülnek, majd egyetlen csoportban küldi el ezeket az üzeneteket vagy elemeket. A köteg fogadója elfogadja ezt a csoportot, és feldolgozza ezeket az üzeneteket vagy elemeket. További információ: Batch-folyamatok üzenetei csoportokban.

  • A lekérdezési verziók helyett használja a webhook-verziókat az eseményindítókhoz és a műveletekhez.

    Miért? A lekérdezési eseményindítók továbbra is meghatározott időközönként ellenőrzik a célszolgáltatást vagy rendszert. Egy nagyon gyakori időköz, például másodpercenként szabályozási problémákat okozhat. A webhook eseményindítója vagy művelete, például a HTTP Webhook azonban csak egyetlen hívást hoz létre a célszolgáltatáshoz vagy a rendszerhez, amely előfizetéskor történik, és azt kéri, hogy a cél csak esemény bekövetkezésekor értesíti az eseményindítót vagy a műveletet. Így az eseményindítónak vagy a műveletnek nem kell folyamatosan ellenőriznie a célhelyet.

    Ha tehát a célszolgáltatás vagy rendszer támogatja a webhookokat, vagy webhookverzióval rendelkező összekötőt biztosít, ez a beállítás jobb, mint a lekérdezési verzió használata. A webhook eseményindítóinak és műveleteinek azonosításához győződjön meg arról, hogy rendelkeznek a ApiConnectionWebhook típussal, vagy hogy nem igénylik az ismétlődés megadását. További információ: APIConnectionWebhook trigger és APIConnectionWebhook művelet.

Következő lépések