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 wichtig, 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 Laufzeit für Trigger abgesehen von Selbstauslöser und Event Hubs werden entfernt, nachdem diese Funktion (GA) allgemein verfügbar wird. Die Unterstützung der Vorschaurichtlinie für alle Trigger außer Selbstauslöser und Event Hubs werden im Oktober 2022 entfernt.

Behandlung von Fehlern

In Azure Functions auftretende Fehler können einen der folgenden Ursprünge haben:

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

Die folgenden bewährten Methoden für die Fehlerbehandlung sind wichtig, um den Verlust von Daten 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 die Wiederholungsrichtlinien für Selbstauslöser und Event Hubs definieren, die ausgelöste Funktionen enthalten. Weitere Informationen finden Sie unter Wiederholungen. Für Trigger, die keine Wiederholungsverhalten bereitstellen, möchten Sie möglicherweise ihr eigenes Wiederholungsschema implementieren.

Design für Idempotenz

Das Auftreten von Fehlern beim Verarbeiten von Daten kann ein Problem für Ihre Funktionen sein, insbesondere bei der Verarbeitung von Nachrichten. Sie müssen 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 Trigger-Erweiterungen und Wiederholungsrichtlinien. In der folgenden Tabelle wird angegeben, welche Trigger Wiederholungen unterstützen und wo das Wiederholungsverhalten konfiguriert ist. Außerdem werden weitere Informationen zu Fehlern, die aus den zugrunde liegenden Diensten stammen, verknüpft.

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

Wiederholungsrichtlinien

Ab Version 3.x der Azure Functions-Laufzeit können Sie eine Wiederholungsrichtlinien für Selbstauslöser und Event Hubs definieren, die von der Funktionslaufzeit 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 ausgelöste Selbstauslöser- oder Event Hubs-Funktion einer nicht erfassten 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. Event Hubs-Prüfpunkte werden nicht geschrieben, bevor die Wiederholungsrichtlinie für die Ausführung vollständig ist. Aufgrund dieses Verhaltens wird der Fortschritt auf der bestimmten Partition angehalten, bis der aktuelle Batch abgeschlossen ist.

Wiederholungsstrategien

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

Zwischen den einzelnen Wiederholungsversuchen kann eine angegebene Zeitspanne vergehen.

Max. Wiederholungsanzahl

Sie können die maximale Anzahl von Wiederholungsversuchen für eine Ausführung, bis diese endgültig als fehlerhaft gilt, konfigurieren. 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 Ereignisselbstauslöser wird in einer neuen Instanz nicht fortgesetzt. Dies bedeutet, dass die maximale Anzahl von Wiederholungsversuchen lediglich ein Ziel ist, und in einigen seltenen Fällen kann eine Ausführung häufiger als der Maximalwert wiederholt werden. Für Ereignisselbstauslöser können die Wiederholungsversuche kleiner als der maximale angeforderte Wert sein.

Beispiele für Wiederholungsversuche

Für Wiederholungen ist das NuGet-Paket Microsoft.Azure.WebJobs= 3.0.23 erforderlich.

[FunctionName("EventHubTrigger")]
[FixedDelayRetry(5, "00:00:10")]
public static async Task Run([EventHubTrigger("myHub", Connection = "EventHubConnection")] EventData[] events, ILogger log)
{
// ...
}
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. Sie geben den Wert 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"
    }
}
Eigenschaft von „function.json“ 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 angewandt wird. Sie geben den Wert als Zeichenfolge im Format HH:mm:ss an.
MinimumIntervall Die geringste Wiederholungsverzögerung bei Verwendung der Strategie exponentialBackoff. Sie geben den Wert als Zeichenfolge im Format HH:mm:ss an.
Maximumintervall Die höchste Wiederholungsverzögerung bei Verwendung der Strategie exponentialBackoff. Sie geben den Wert als Zeichenfolge im Format HH:mm:ss an.

Dies ist ein Python-Beispiel für die Verwendung des Wiederholungskontexts in einer Funktion:

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