Fehlerbehandlung und Wiederholungen in Azure Functions

Das Behandeln von Fehlern in Azure Functions ist wichtig, um verlorene Daten und verpasste Ereignisse zu vermeiden sowie um die Integrität Ihrer Anwendung zu überwachen. Es ist auch eine wichtige Methode, um das Wiederholungsverhalten von ereignisbasierten Triggern zu verstehen.

In diesem Artikel werden allgemeine Strategien für die Fehlerbehandlung und die verfügbaren Wiederholungsstrategien beschrieben.

Wichtig

Die Unterstützung der Wiederholungsrichtlinie in der Runtime für andere Trigger als Zeitgeber, Kafka und Event Hubs wird entfernt, wenn diese Funktion allgemein verfügbar geworden ist. Die Unterstützung der Vorschauwiederholungsrichtlinie für alle Trigger außer Zeitgeber und Event Hubs wurde im Dezember 2022 entfernt. Weitere Informationen finden Sie im Abschnitt zu den Wiederholungsversuchen.

Behandlung von Fehlern

Fehler, die in einer Azure-Funktion auftreten, können folgende Ursachen haben:

  • Verwendung integrierter Azure Functions-Trigger und -Bindungen
  • Aufrufe an APIs zugrunde liegender Azure-Dienste
  • Aufrufe an REST-Endpunkte
  • Aufrufe an Clientbibliotheken, Pakete oder Drittanbieter-APIs

Für die Fehlerbehandlung sind bewährte Methoden wichtig, um Datenverluste oder verpasste Nachrichten zu vermeiden. In diesem Abschnitt werden einige empfohlene Fehlerbehandlungspraktiken mit Links zu weiteren Informationen beschrieben.

Aktivieren von Application Insights

Azure Functions wird in Application Insights integriert, um Fehlerdaten, Leistungsdaten und Laufzeitprotokolle zu sammeln. Sie sollten Application Insights verwenden, um Fehler zu ermitteln und besser zu verstehen, die in Ihren Funktionsausführungen auftreten. Weitere Informationen finden Sie unter Überwachen von Azure Functions.

Verwenden strukturierter Fehlerbehandlung

Das Erfassen und Protokollieren von Fehlern ist kritisch für die Überwachung der Integrität Ihrer Anwendung. Die oberste Ebene jedes Funktioncodes sollte einen try/catch-Block enthalten. Im catch-Block können Sie Fehler erfassen und protokollieren. Informationen zu den Fehlern, die durch Bindungen ausgelöst werden können, finden Sie unter Bindungsfehlercodes.

Planen Ihrer Wiederholungsstrategie

Mehrere Funktionsverbindungserweiterungen bieten integrierte Unterstützung für Wiederholungen. Darüber hinaus können Sie mit der Runtime die Wiederholungsrichtlinien für durch Zeitgeber, Kafka und Event Hubs ausgelöste Funktionen definieren. Weitere Informationen finden Sie unter Wiederholungen. Für Trigger, die keine Wiederholungsverhalten bereitstellen, möchten Sie möglicherweise ein eigenes Wiederholungsschema implementieren.

Design für Idempotenz

Das Auftreten von Fehlern beim Verarbeiten von Daten kann ein Problem für Ihre Funktionen darstellen, insbesondere bei der Verarbeitung von Nachrichten. Es ist wichtig, zu berücksichtigen, was geschieht, wenn der Fehler auftritt, und wie Sie doppelte Verarbeitung vermeiden. Weitere Informationen finden Sie unter Entwerfen von Azure Functions für identische Eingaben.

Wiederholungsversuche

Es gibt zwei Arten von Wiederholungen, die für Ihre Funktionen verfügbar sind:

  • Integrierte Wiederholungsverhalten einzelner Triggererweiterungen
  • Von der Functions-Runtime bereitgestellte Wiederholungsrichtlinien

In der folgenden Tabelle wird angegeben, welche Trigger Wiederholungen unterstützen und wo das Wiederholungsverhalten konfiguriert ist. Außerdem enthält sie Links zu weiteren Informationen zu Fehlern, die aus den zugrunde liegenden Diensten stammen.

Trigger/Bindung Wiederholen der Quelle Konfiguration
Azure Cosmos DB Wiederholungsrichtlinien Funktionsebene
Azure Blob Storage Bindungserweiterung host.json
Azure Event Grid Bindungserweiterung Ereignisabonnement
Azure Event Hubs Wiederholungsrichtlinien Funktionsebene
Azure Queue Storage Bindungserweiterung host.json
RabbitMQ Bindungserweiterung Warteschlange für unzustellbare Nachrichten
Azure Service Bus Bindungserweiterung Warteschlange für unzustellbare Nachrichten
Timer Wiederholungsrichtlinien Funktionsebene
Kafka Wiederholungsrichtlinien Funktionsebene

Wiederholungsrichtlinien

Ab Version 3.x der Azure Functions-Runtime können Sie Wiederholungsrichtlinien für Zeitgeber-, Kafka-, Event Hubs- und Azure Cosmos DB-Trigger definieren, die von der Functions-Runtime erzwungen werden.

Die Wiederholungsrichtlinie teilt der Laufzeit mit, eine fehlgeschlagene Ausführung erneut auszuführen, bis entweder eine erfolgreiche Fertigstellung auftritt oder die maximale Anzahl von Wiederholungen erreicht wird.

Eine Wiederholungsrichtlinie wird ausgewertet, wenn eine durch Zeitgeber, Kafka, Event Hubs oder Azure Cosmos DB ausgelöste Funktion eine nicht abgefangene Ausnahme auslöst. Es hat sich bewährt, alle Ausnahmen in Ihrem Code abzufangen und alle Fehler erneut auszulösen, die zu einem Wiederholungsversuch führen sollten.

Wichtig

Event Hubs-Prüfpunkte werden erst geschrieben, wenn die Wiederholungsrichtlinie für die Ausführung abgeschlossen ist. Aufgrund dieses Verhaltens wird der Fortschritt auf der bestimmten Partition angehalten, bis der aktuelle Batch abgeschlossen ist.

Die Event Hubs v5-Erweiterung unterstützt zusätzliche Wiederholungsfunktionen für Interaktionen zwischen dem Functions-Host und dem Event Hub. Weitere Informationen finden Sie im Event Hubs-Abschnitt der host.json-Datei in den clientRetryOptions.

Wiederholungsstrategien

Sie können zwei Wiederholungsstrategien konfigurieren, die von der Richtlinie unterstützt werden:

Zwischen den einzelnen Wiederholungsversuchen kann eine angegebene Zeitspanne vergehen.

Max. Wiederholungsanzahl

Sie können die maximale Anzahl von Wiederholungsversuchen für eine Ausführung konfigurieren, bis diese endgültig als fehlerhaft gilt. Die aktuelle Wiederholungsanzahl wird im Arbeitsspeicher der Instanz gespeichert.

Es kann vorkommen, dass bei einer Instanz zwischen Wiederholungsversuchen ein Fehler auftritt. Wenn auf einer Instanz während einer Wiederholungsrichtlinie ein Fehler auftritt, geht die Zählung der Wiederholungsversuche verloren. Bei Instanz-Fehlern ist Event Hubs in der Lage, den Prozess fortzusetzen und den Batch der neuen Instanz wiederholen wobei die Wiederholungsanzahl auf null zurückgesetzt wird. Der Zeitgebertrigger wird in einer neuen Instanz nicht fortgesetzt.

Aufgrund dieses Verhaltens kann die Einhaltung der maximalen Wiederholungsanzahl nicht garantiert werden. In seltenen Fällen können auch mehr Wiederholungsversuche erfolgen. Für Zeitgebertrigger kann die Anzahl von Wiederholungsversuchen geringer als die angeforderte maximale Anzahl sein.

Beispiele für Wiederholungsversuche

Wiederholungsversuche auf Funktionsebene werden mit den folgenden NuGet-Paketen unterstützt:

[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}");
}
Eigenschaft BESCHREIBUNG
MaxRetryCount Erforderlich. Die maximale Anzahl zulässiger Wiederholungen pro Funktionsausführung. -1 bedeutet unbegrenzte Wiederholungen.
DelayInterval Die Verzögerung, die zwischen Wiederholungsversuchen verwendet wird. Geben Sie sie als Zeichenfolge im Format HH:mm:ss an.

Wiederholungsrichtlinie in der Datei function.json:

{
    "disabled": false,
    "bindings": [
        {
            ....
        }
    ],
    "retry": {
        "strategy": "fixedDelay",
        "maxRetryCount": 4,
        "delayInterval": "00:00:10"
    }
}
function.json-Eigenschaft BESCHREIBUNG
strategy Erforderlich. Die Wiederholungsstrategie, die verwendet werden soll. Gültige Werte sind fixedDelay und exponentialBackoff.
maxRetryCount Erforderlich. Die maximale Anzahl zulässiger Wiederholungen pro Funktionsausführung. -1 bedeutet unbegrenzte Wiederholungen.
delayInterval Die Verzögerung, die zwischen Wiederholungsversuchen bei Verwendung der Strategie fixedDelay angewendet wird. Geben Sie sie als Zeichenfolge im Format HH:mm:ss an.
MinimumIntervall Die geringste Wiederholungsverzögerung bei Verwendung der Strategie exponentialBackoff. Geben Sie sie als Zeichenfolge im Format HH:mm:ss an.
Maximumintervall Die maximale Wiederholungsverzögerung bei Verwendung der Strategie exponentialBackoff. Geben Sie sie als Zeichenfolge im Format HH:mm:ss an.

Dies ist ein Python-Beispiel, in dem der Wiederholungskontext in einer Funktion verwendet wird:

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());
}

Bindungsfehlercodes

Bei der Integration in Azure-Dienste können Fehler auftreten, deren Ursache in den APIs der zugrunde liegenden Dienste liegt. Informationen zu bindungsspezifischen Fehlern finden Sie im Abschnitt „Ausnahmen und Rückgabecodes“ der folgenden Artikel:

Nächste Schritte