Hibakezelés és újrapróbálkozások az Azure Functionsben

Az Azure Functions hibáinak kezelése fontos az elveszett adatok elkerüléséhez, a kihagyott események elkerüléséhez és az alkalmazás állapotának figyeléséhez. Fontos módszer az eseményalapú eseményindítók újrapróbálkozási viselkedésének megértésére is.

Ez a cikk a hibakezelés általános stratégiáit és az elérhető újrapróbálkozési stratégiákat ismerteti.

Fontos

Ha ez a funkció általánosan elérhetővé válik, eltávolítjuk az újrapróbálkozási szabályzat támogatását a futtatókörnyezetben az Időzítő, a Kafka és az Event Hubs kivételével. 2022 decemberében az előzetes verzió újrapróbálkozó házirend-támogatása az Időzítő és az Event Hubs kivételével minden eseményindító esetében el lett távolítva. További információ: Újrapróbálkozás szakasz.

Hibák kezelése

Az Azure-függvényekben előforduló hibák az alábbiak bármelyikéből eredhetnek:

  • Beépített Azure Functions-eseményindítók és kötések használata
  • Az alapul szolgáló Azure-szolgáltatások API-jainak hívásai
  • REST-végpontokra irányuló hívások
  • Ügyfélkódtárakra, csomagokra vagy külső API-kra irányuló hívások

Az adatvesztés vagy az elmulasztott üzenetek elkerülése érdekében fontos a helyes hibakezelés gyakorlata. Ez a szakasz néhány ajánlott hibakezelési eljárást ismertet, és további információkra mutató hivatkozásokat tartalmaz.

Az Application Insights engedélyezése

Az Azure Functions integrálható az Application Elemzések szolgáltatással a hibaadatok, a teljesítményadatok és a futásidejű naplók gyűjtéséhez. Az Application Elemzések használatával felderítheti és jobban megértheti a függvényvégrehajtásokban előforduló hibákat. További információ: Az Azure Functions monitorozása.

Strukturált hibakezelés használata

A rögzítési és naplózási hibák kritikus fontosságúak az alkalmazás állapotának monitorozásához. A függvénykódok legfelső szintjének tartalmaznia kell egy próba-/fogási blokkot. A fogási blokkban rögzítheti és naplózhatja a hibákat. A kötések által esetlegesen felmerülő hibákról további információt a Kötés hibakódok című témakörben talál.

Az újrapróbálkozás stratégiájának megtervezve

Számos Functions-kötésbővítmény nyújt beépített támogatást az újrapróbálkozásokhoz. Emellett a futtatókörnyezet lehetővé teszi újrapróbálkozási szabályzatok meghatározását az Időzítő, a Kafka és az Event Hubs által aktivált függvényekhez. További információ: Újrapróbálkozás. Az újrapróbálkozási viselkedést nem biztosító eseményindítók esetében érdemes lehet saját újrapróbálkozási sémát implementálni.

Idempotencia tervezése

Az adatok feldolgozásakor előforduló hibák problémát jelenthetnek a függvények számára, különösen akkor, ha üzeneteket dolgoz fel. Fontos megfontolni, hogy mi történik a hiba bekövetkezésekor, és hogyan kerülheti el a duplikált feldolgozást. További információ: Az Azure Functions tervezése azonos bemenethez.

Újrapróbálkozások

A függvényekhez kétféle újrapróbálkozás érhető el:

  • Az egyes triggerbővítmények beépített újrapróbálkozási viselkedése
  • A Functions-futtatókörnyezet által biztosított újrapróbálkozási szabályzatok

Az alábbi táblázat azt jelzi, hogy mely eseményindítók támogatják az újrapróbálkozásokat, és hol van konfigurálva az újrapróbálkozási viselkedés. A mögöttes szolgáltatásokból származó hibákra vonatkozó további információkra is hivatkozik.

Trigger/kötés Újrapróbálkozás forrása Konfiguráció
Azure Cosmos DB Újrapróbálkozás szabályzatai Függvényszint
Azure Blob Storage Kötésbővítmény host.json
Azure Event Grid Kötésbővítmény Esemény-előfizetés
Azure-eseményközpontok Újrapróbálkozás szabályzatai Függvényszint
Azure Queue Storage Kötésbővítmény host.json
RabbitMQ Kötésbővítmény Kézbesítetlen levelek üzenetsora
Azure Service Bus Kötésbővítmény Kézbesítetlen levelek üzenetsora
Időzítő Újrapróbálkozás szabályzatai Függvényszint
Kafka Újrapróbálkozás szabályzatai Függvényszint

Újrapróbálkozási szabályzatok

Az Azure Functions-futtatókörnyezet 3.x verziójától kezdve definiálhat újrapróbálkozási szabályzatokat az Időzítő, a Kafka, az Event Hubs és az Azure Cosmos DB-eseményindítókhoz, amelyeket a Functions-futtatókörnyezet kényszerít.

Az újrapróbálkozási szabályzat arra utasítja a futtatókörnyezetet, hogy futtassa újra a sikertelen végrehajtást, amíg el nem éri a sikeres teljesítést, vagy el nem éri az újrapróbálkozások maximális számát.

Az újrapróbálkozásokra vonatkozó szabályzat akkor lesz kiértékelve, ha egy Időzítő, Kafka, Event Hubs vagy Azure Cosmos DB által aktivált függvény váratlan kivételt eredményez. Ajánlott eljárásként minden kivételt ki kell szűrnie a kódból, és újra kell tapasztalnia az újrapróbálkozást eredményező hibákat.

Fontos

Az Event Hubs ellenőrzőpontjai csak akkor lesznek megírva, ha a végrehajtás újrapróbálkozási szabályzata befejeződött. Emiatt a folyamat az adott partíción szünetel, amíg az aktuális köteg be nem fejeződik.

Az Event Hubs v5 bővítmény további újrapróbálkozási képességeket támogat a Functions-gazdagép és az eseményközpont közötti interakciókhoz. További információért tekintse meg a clientRetryOptionshost.json fájl Event Hubs szakaszát.

Újrapróbálkozási stratégiák

A szabályzat által támogatott két újrapróbálkozési stratégiát konfigurálhat:

Az egyes újrapróbálkozások között meghatározott idő telik el.

Újrapróbálkozások maximális száma

Konfigurálhatja, hogy a függvények végrehajtása a végleges hiba előtt legfeljebb hány alkalommal legyen újrapróbálkozva. Az újrapróbálkozás aktuális száma a példány memóriájában van tárolva.

Előfordulhat, hogy egy példánynál hiba történt az újrapróbálkozási kísérletek között. Ha egy példány meghiúsul egy újrapróbálkozási szabályzat során, az újrapróbálkozási szám elveszik. Példányhibák esetén az Event Hubs-eseményindító folytathatja a feldolgozást, és újrapróbálkozza a köteget egy új példányon, és az újrapróbálkozások száma nullára állítható vissza. Az időzítő eseményindítója nem folytatódik egy új példányon.

Ez a viselkedés azt jelenti, hogy az újrapróbálkozás maximális száma a legjobb megoldás. Bizonyos ritka esetekben a végrehajtás a kért maximális számnál több alkalommal is újrapróbálkozott. Időzítő eseményindítók esetén az újrapróbálkozások kisebbek lehetnek a kért maximális számnál.

Példák újrapróbálkozása

A függvényszintű újrapróbálkozásokat a következő NuGet-csomagok támogatják:

[Function(nameof(TimerFunction))]
[FixedDelayRetry(5, "00:00:10")]
public static void Run([TimerTrigger("0 */5 * * * *")] TimerInfo timerInfo,
    FunctionContext context)
{
    var logger = context.GetLogger(nameof(TimerFunction));
    logger.LogInformation($"Function Ran. Next timer schedule = {timerInfo.ScheduleStatus.Next}");
}
Tulajdonság Leírás
MaxRetryCount Szükséges. A függvényvégrehajtásonként engedélyezett újrapróbálkozések maximális száma. -1 azt jelenti, hogy határozatlan időre újrapróbálkoznak.
DelayInterval Az újrapróbálkozások közötti késés. Adja meg sztringként a formátumot HH:mm:ss.

A function.json fájlban az újrapróbálkozás szabályzata a következő :

{
    "disabled": false,
    "bindings": [
        {
            ....
        }
    ],
    "retry": {
        "strategy": "fixedDelay",
        "maxRetryCount": 4,
        "delayInterval": "00:00:10"
    }
}
function.json tulajdonság Leírás
Stratégia Szükséges. A használt újrapróbálkozási stratégia. Az érvényes értékek a következők: fixedDelay vagy exponentialBackoff.
maxRetryCount Szükséges. A függvényvégrehajtásonként engedélyezett újrapróbálkozések maximális száma. -1 azt jelenti, hogy határozatlan időre újrapróbálkoznak.
delayInterval A stratégia használatakor fixedDelay az újrapróbálkozások közötti késés. Adja meg sztringként a formátumot HH:mm:ss.
minimumInterval A minimális újrapróbálkozás késleltetése egy stratégia használatakor exponentialBackoff . Adja meg sztringként a formátumot HH:mm:ss.
maximumInterval A maximális újrapróbálkozás késleltetése a stratégia használatakor exponentialBackoff . Adja meg sztringként a formátumot HH:mm:ss.

Íme egy Python-minta, amely az újrapróbálkozás kontextusát használja egy függvényben:

import azure.functions
import logging


def main(mytimer: azure.functions.TimerRequest, context: azure.functions.Context) -> None:
    logging.info(f'Current retry count: {context.retry_context.retry_count}')

    if context.retry_context.retry_count == context.retry_context.max_retry_count:
        logging.warn(
            f"Max retries of {context.retry_context.max_retry_count} for "
            f"function {context.function_name} has been reached")

@FunctionName("TimerTriggerJava1")
@FixedDelayRetry(maxRetryCount = 4, delayInterval = "00:00:10")
public void run(
    @TimerTrigger(name = "timerInfo", schedule = "0 */5 * * * *") String timerInfo,
    final ExecutionContext context
) {
    context.getLogger().info("Java Timer trigger function executed at: " + LocalDateTime.now());
}

Kötési hibakódok

Az Azure-szolgáltatásokkal való integráció során a hibák a mögöttes szolgáltatások API-jaiból eredhetnek. A kötésspecifikus hibákra vonatkozó információk a következő cikkek "Kivételek és visszatérési kódok" szakaszában érhetők el:

Következő lépések