Zpracování chyb a opakování ve službě Azure Functions

Zpracování chyb ve službě Azure Functions je důležité, abyste se vyhnuli ztraceným datům, vyhnuli se zmeškaným událostem a monitorovali stav vaší aplikace. Je to také důležitý způsob, jak pochopit chování opakování triggerů založených na událostech.

Tento článek popisuje obecné strategie pro zpracování chyb a dostupné strategie opakování.

Důležité

Odebíráme podporu zásad opakování v modulu runtime pro triggery jiné než Timer, Kafka a Event Hubs, jakmile bude tato funkce obecně dostupná (GA). V prosinci 2022 byla odebrána podpora zásad opakování ve verzi Preview pro všechny triggery kromě časovače a služby Event Hubs. Další informace najdete v části Opakování .

Zpracování chyb

Chyby, ke kterým dochází ve funkci Azure, můžou mít za následek některou z následujících možností:

  • Použití integrovaných triggerů a vazeb Azure Functions
  • Volání rozhraní API základních služeb Azure
  • Volání koncových bodů REST
  • Volání klientských knihoven, balíčků nebo rozhraní API třetích stran

Abyste se vyhnuli ztrátě dat nebo zmeškaných zpráv, je důležité vyzkoušet správné zpracování chyb. Tato část popisuje některé doporučené postupy zpracování chyb a obsahuje odkazy na další informace.

Povolit Application Insights

Azure Functions se integruje s aplikačními Přehledy za účelem shromažďování dat o chybách, dat o výkonu a protokolů modulu runtime. K zjišťování a lepšímu porozumění chybám, ke kterým dochází při provádění funkce, byste měli použít Přehledy aplikace. Další informace najdete v tématu Monitorování azure Functions.

Použití strukturovaného zpracování chyb

Zachytávání a protokolování chyb je důležité pro monitorování stavu vaší aplikace. Nejvyšší úroveň kódu funkce by měla obsahovat blok try/catch. V bloku catch můžete zachytit a protokolovat chyby. Informace o chybách, které mohou být vyvolány vazbami, naleznete v tématu Kódy chyb vazby.

Plánování strategie opakování

Několik rozšíření vazeb Functions poskytují integrovanou podporu opakování. Modul runtime navíc umožňuje definovat zásady opakování pro funkce aktivované timerem, Kafka a Event Hubs. Další informace najdete v tématu Opakování. U triggerů, které neposkytují chování opakování, můžete chtít implementovat vlastní schéma opakování.

Návrh pro idempotenci

Výskyt chyb při zpracování dat může být pro vaše funkce problém, zejména při zpracování zpráv. Je důležité zvážit, co se stane, když dojde k chybě a jak se vyhnout duplicitnímu zpracování. Další informace najdete v tématu Návrh služby Azure Functions pro stejný vstup.

Opakování

Pro vaše funkce jsou k dispozici dva druhy opakování:

  • Předdefinované chování opakování jednotlivých rozšíření triggerů
  • Zásady opakování poskytované modulem runtime Služby Functions

Následující tabulka uvádí, které triggery podporují opakování a kde je nakonfigurované chování opakování. Odkazuje také na další informace o chybách, které pocházejí z podkladových služeb.

Aktivační událost nebo vazba Zdroj opakování Konfigurace
Azure Cosmos DB Zásady opakování Úroveň funkce
Azure Blob Storage Rozšíření vazby host.json
Azure Event Grid Rozšíření vazby Předplatné události
Azure Event Hubs Zásady opakování Úroveň funkce
Azure Queue Storage Rozšíření vazby host.json
RabbitMQ Rozšíření vazby Fronta nedoručených zpráv
Azure Service Bus Rozšíření vazby Fronta nedoručených zpráv
Časovač Zásady opakování Úroveň funkce
Kafka Zásady opakování Úroveň funkce

Zásady opakování pokusů

Počínaje modulem runtime Azure Functions verze 3.x můžete definovat zásady opakování pro triggery Timer, Kafka, Event Hubs a Azure Cosmos DB, které jsou vynuceny modulem runtime služby Functions.

Zásada opakování říká modulu runtime, aby znovu spustil neúspěšné spuštění, dokud nedojde k úspěšnému dokončení, nebo se dosáhne maximálního počtu opakování.

Zásady opakování se vyhodnocují, když funkce aktivovaná službou Timer, Kafka, Event Hubs nebo Azure Cosmos DB vyvolá nezachycenou výjimku. Osvědčeným postupem je zachytávat všechny výjimky v kódu a znovu narůstat všechny chyby, které chcete vyústit v opakování.

Důležité

Kontrolní body služby Event Hubs nebudou zapsány, dokud se nedokončí zásady opakování provádění. Kvůli tomuto chování je průběh konkrétního oddílu pozastaven, dokud aktuální dávka nedokončí.

Rozšíření Event Hubs v5 podporuje další možnosti opakování pro interakce mezi hostitelem služby Functions a centrem událostí. clientRetryOptions Další informace najdete v části Event Hubs v souboru host.json.

Strategie opakování

Můžete nakonfigurovat dvě strategie opakování, které jsou podporovány zásadami:

Mezi jednotlivými opakováními je povoleno uplynulo určité množství času.

Maximální počet opakování

Můžete nakonfigurovat maximální počet opakování spuštění funkce před případným selháním. Aktuální počet opakování je uložen v paměti instance.

Instance může mít chybu mezi opakovanými pokusy. Pokud instance selže během zásady opakování, počet opakování se ztratí. Pokud dojde k selháním instance, trigger Event Hubs dokáže obnovit zpracování a opakovat dávku v nové instanci s resetováním počtu opakování na nulu. Trigger časovače se v nové instanci neobnoví.

Toto chování znamená, že maximální počet opakování je nejlepším úsilím. V některých výjimečných případech může být provedení opakovat více než požadovaný maximální počet opakování. U aktivačních událostí časovače může být opakování menší než maximální požadovaný počet.

Příklady opakování

Opakování na úrovni funkce se podporuje s následujícími balíčky NuGet:

[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}");
}
Vlastnost Popis
MaxRetryCount Povinný: Maximální počet opakování povolených pro každé spuštění funkce. -1 znamená opakování po neomezenou dobu.
DelayInterval Zpoždění, které se používá mezi opakovanými pokusy. Zadejte ho jako řetězec s formátem HH:mm:ss.

Tady jsou zásady opakování v souboru function.json :

{
    "disabled": false,
    "bindings": [
        {
            ....
        }
    ],
    "retry": {
        "strategy": "fixedDelay",
        "maxRetryCount": 4,
        "delayInterval": "00:00:10"
    }
}
vlastnost function.json Popis
Strategie Povinný: Používaná strategie opakování. Platné hodnoty jsou fixedDelay nebo exponentialBackoff.
maxRetryCount Povinný: Maximální počet opakování povolených pro každé spuštění funkce. -1 znamená opakování po neomezenou dobu.
delayInterval Zpoždění, které se používá mezi opakovanými pokusy, když používáte fixedDelay strategii. Zadejte ho jako řetězec s formátem HH:mm:ss.
minimumInterval Minimální prodleva opakování při použití exponentialBackoff strategie. Zadejte ho jako řetězec s formátem HH:mm:ss.
maximumInterval Maximální prodleva opakování při použití exponentialBackoff strategie. Zadejte ho jako řetězec s formátem HH:mm:ss.

Tady je ukázka Pythonu, která používá kontext opakování ve funkci:

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ódy chyb vazeb

Při integraci se službami Azure můžou chyby pocházet z rozhraní API základních služeb. Informace týkající se chyb specifických pro vazby jsou k dispozici v částech Výjimky a návratové kódy v následujících článcích:

Další kroky