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

Az előzetes verziójú újrapróbálkozási szabályzat bizonyos eseményindítók esetében 2022 decemberében el lett távolítva. A támogatott eseményindítókra vonatkozó újrapróbálkozási szabályzatok már általánosan elérhetők (GA). Az újrapróbálkozási szabályzatokat jelenleg támogató bővítmények listáját az Újrapróbálkozások szakaszban találja.

Hibák kezelése

Az Azure-függvényekben előforduló hibák a következő esetekben fordulhatnak elő:

  • Beépített Functions-triggerek és kötések használata.
  • A mögöttes Azure-szolgáltatások API-jainak hívásai.
  • A REST-végpontokra irányuló hívások.
  • Ügyfélkódtárak, csomagok vagy külső API-k hívása.

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

Ajánlás Részletek
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 adott újrapróbálkozási stratégiától függően új kivételt is jelenthet a függvény ismételt futtatásához.
Az újrapróbálkozás stratégiájának megtervezve Számos Functions-kötésbővítmény beépített támogatást nyújt az újrapróbálkozásokhoz, míg mások lehetővé teszik újrapróbálkozási szabályzatok meghatározását, amelyeket a Functions-futtatókörnyezet implementál. Az újrapróbálkozási viselkedést nem biztosító eseményindítók esetében érdemes megfontolni a saját újrapróbálkozási séma implementálását. További információ: Újrapróbálkozás.
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
Blob Storage Kötésbővítmény host.json
Event Grid Kötésbővítmény Esemény-előfizetés
Event Hubs Újrapróbálkozás szabályzatai Függvényszint
Kafka Újrapróbálkozás szabályzatai Függvényszint
Queue Storage Kötésbővítmény host.json
RabbitMQ Kötésbővítmény Kézbesítetlen levelek üzenetsora
Service Bus Kötésbővítmény host.json*
Időzítő Újrapróbálkozás szabályzatai Függvényszint

*Az Azure Service Bus bővítmény 5.x-es verziójára van szükség. A régebbi bővítményverziókban az újrapróbálkozási viselkedéseket a Service Bus kézbesítetlen levelek üzenetsora valósítja meg.

Újrapróbálkozási szabályzatok

Az Azure Functions lehetővé teszi az újrapróbálkozási szabályzatok definiálását bizonyos triggertípusokhoz, amelyeket a futtatókörnyezet kényszerít. Az alábbi triggertípusok jelenleg támogatják az újrapróbálkozási szabályzatokat:

Az újrapróbálkozás támogatása ugyanaz a v1 és v2 Python programozási modellek esetében is.

Az újrapróbálkozási szabályzatok nem támogatottak a Functions-futtatókörnyezet 1.x-es verziójában.

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ási szabályzat akkor lesz kiértékelve, ha egy támogatott eseményindító-típus által végrehajtott függvény váratlan kivételt eredményez. Ajánlott eljárásként a kódban szereplő összes kivételt ki kell fognia, és új kivételeket kell létrehoznia az újrapróbálkozást eredményező hibák esetén.

Fontos

Az Event Hubs-ellenőrzőpontok írása csak a végrehajtás újrapróbálkozási szabályzatának befejeződése után lesz megírva. Emiatt a folyamat az adott partíción szünetel, amíg az aktuális köteg feldolgozásra nem kerül.

Az Event Hubs bővítmény 5.x-es verziója 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ó clientRetryOptions : Event Hubs host.json referencia.

Ú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.

Használatalapú csomagban való futtatáskor a rendszer csak a függvénykód végrehajtásának idejére számláz. Ezen újrapróbálkozási stratégiák egyikében sem kell fizetnie a végrehajtások közötti várakozási időre.

Ú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 rögzített késleltetési és exponenciális visszalépési stratégiákra is van példa. Egy adott stratégiára vonatkozó példák megtekintéséhez először ki kell választania ezt a stratégiát az előző lapon.

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.

Íme egy példa a function.json fájlban definiált újrapróbálkozési szabályzatra:

{
    "disabled": false,
    "bindings": [
        {
            ....
        }
    ],
    "retry": {
        "strategy": "fixedDelay",
        "maxRetryCount": 4,
        "delayInterval": "00:00:10"
    }
}

Ezeket a tulajdonságokat újrapróbálkozási szabályzatdefiníciókon állíthatja be:

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.

Az eseményindító újrapróbálkozási szabályzatának definiálása a Node.js verziójától függ.

Íme egy példa egy időzítő triggerfüggvényre, amely rögzített késleltetési újrapróbálkozási stratégiát használ:

const { app } = require('@azure/functions');

app.timer('timerTriggerWithRetry', {
    schedule: '0 */5 * * * *',
    retry: {
        strategy: 'fixedDelay',
        delayInterval: {
            seconds: 10,
        },
        maxRetryCount: 4,
    },
    handler: (myTimer, context) => {
        if (context.retryContext?.retryCount < 2) {
            throw new Error('Retry!');
        } else {
            context.log('Timer function processed request.');
        }
    },
});

Az eseményindító újrapróbálkozási szabályzatának definiálása a Node.js verziójától függ.

Íme egy példa egy időzítő triggerfüggvényre, amely rögzített késleltetési újrapróbálkozási stratégiát használ:

import { app, InvocationContext, Timer } from '@azure/functions';

export async function timerTriggerWithRetry(myTimer: Timer, context: InvocationContext): Promise<void> {
    if (context.retryContext?.retryCount < 2) {
        throw new Error('Retry!');
    } else {
        context.log('Timer function processed request.');
    }
}

app.timer('timerTriggerWithRetry', {
    schedule: '0 */5 * * * *',
    retry: {
        strategy: 'fixedDelay',
        delayInterval: {
            seconds: 10,
        },
        maxRetryCount: 4,
    },
    handler: timerTriggerWithRetry,
});

Ezeket a tulajdonságokat újrapróbálkozási szabályzatdefiníciókon állíthatja be:

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 példa egy időzítő triggerfüggvényre, amely rögzített késleltetési újrapróbálkozási stratégiát használ:

from azure.functions import FunctionApp, TimerRequest, Context, AuthLevel
import logging

app = FunctionApp(http_auth_level=AuthLevel.ANONYMOUS)


@app.timer_trigger(schedule="*/1 * * * * *", arg_name="mytimer",
                   run_on_startup=False,
                   use_monitor=False)
@app.retry(strategy="fixed_delay", max_retry_count="3",
           delay_interval="00:00:01")
def mytimer(mytimer: TimerRequest, context: 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.info(
            f"Max retries of {context.retry_context.max_retry_count} for "
            f"function {context.function_name} has been reached")
    else:
        raise Exception("This is a retryable exception")

Ezeket a tulajdonságokat újrapróbálkozási szabályzatdefiníciókon állíthatja be:

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: fixed_delay vagy exponential_backoff.
max_retry_count 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.
delay_interval A stratégia használatakor fixed_delay az újrapróbálkozások közötti késés. Adja meg sztringként a formátumot HH:mm:ss.
minimum_interval A minimális újrapróbálkozás késleltetése egy stratégia használatakor exponential_backoff . Adja meg sztringként a formátumot HH:mm:ss.
maximum_interval A maximális újrapróbálkozás késleltetése a stratégia használatakor exponential_backoff . Adja meg sztringként a formátumot HH:mm:ss.
@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