Obsługa błędów oraz wykonywanie ponownych prób w usłudze Azure Functions

Obsługa błędów w usłudze Azure Functions jest ważna, aby uniknąć utraconych danych, uniknąć pominiętych zdarzeń i monitorować kondycję aplikacji. Jest to również ważny sposób, aby ułatwić zrozumienie zachowań ponawiania prób wyzwalaczy opartych na zdarzeniach.

W tym artykule opisano ogólne strategie obsługi błędów i dostępne strategie ponawiania prób.

Ważne

Usuwamy obsługę zasad ponawiania prób w środowisku uruchomieniowym dla wyzwalaczy innych niż Czasomierz, Kafka i Event Hubs po tym, jak ta funkcja stanie się ogólnie dostępna . Obsługa zasad ponawiania prób w wersji zapoznawczej dla wszystkich wyzwalaczy innych niż czasomierz i usługa Event Hubs została usunięta w grudniu 2022 r. Aby uzyskać więcej informacji, zobacz sekcję Ponowne próby .

Obsługa błędów

Błędy występujące w funkcji platformy Azure mogą wynikać z dowolnego z następujących elementów:

  • Korzystanie z wbudowanych wyzwalaczy i powiązań usługi Azure Functions
  • Wywołania do interfejsów API bazowych usług platformy Azure
  • Wywołania do punktów końcowych REST
  • Wywołania bibliotek klienckich, pakietów lub interfejsów API innych firm

Aby uniknąć utraty danych lub nieodebranych komunikatów, ważne jest, aby przećwiczyć dobrą obsługę błędów. W tej sekcji opisano niektóre zalecane rozwiązania dotyczące obsługi błędów i podano linki do dodatkowych informacji.

Włącz usługę Application Insights

Usługa Azure Functions integruje się z usługą Application Szczegółowe informacje w celu zbierania danych o błędach, danych wydajności i dzienników środowiska uruchomieniowego. Aby odnaleźć i lepiej zrozumieć błędy występujące w wykonywaniach funkcji, należy użyć Szczegółowe informacje Aplikacji. Aby dowiedzieć się więcej, zobacz Monitorowanie usługi Azure Functions.

Korzystanie z obsługi błędów ustrukturyzowanych

Przechwytywanie i rejestrowanie błędów ma kluczowe znaczenie dla monitorowania kondycji aplikacji. Najwyższy poziom dowolnego kodu funkcji powinien zawierać blok try/catch. W bloku catch można przechwytywać i rejestrować błędy. Aby uzyskać informacje o błędach, które mogą być zgłaszane przez powiązania, zobacz Binding error codes (Kody błędów powiązań).

Planowanie strategii ponawiania prób

Kilka rozszerzeń powiązań usługi Functions zapewnia wbudowaną obsługę ponownych prób. Ponadto środowisko uruchomieniowe umożliwia definiowanie zasad ponawiania prób dla funkcji wyzwalanych przez czasomierz, Kafka i Event Hubs. Aby dowiedzieć się więcej, zobacz Ponowne próby. W przypadku wyzwalaczy, które nie zapewniają zachowania ponawiania prób, warto zaimplementować własny schemat ponawiania prób.

Projektowanie pod kątem idempotentności

Występowanie błędów podczas przetwarzania danych może być problemem dla funkcji, zwłaszcza podczas przetwarzania komunikatów. Ważne jest, aby wziąć pod uwagę, co się stanie, gdy wystąpi błąd i jak uniknąć zduplikowanego przetwarzania. Aby dowiedzieć się więcej, zobacz Projektowanie usługi Azure Functions pod kątem identycznych danych wejściowych.

Ponowne próby

Istnieją dwa rodzaje ponownych prób dostępnych dla funkcji:

  • Wbudowane zachowania ponawiania poszczególnych rozszerzeń wyzwalacza
  • Zasady ponawiania próby udostępniane przez środowisko uruchomieniowe usługi Functions

Poniższa tabela wskazuje, które wyzwalacze obsługują ponawianie prób i gdzie skonfigurowano zachowanie ponawiania. Zawiera również linki do dodatkowych informacji o błędach pochodzących z podstawowych usług.

Wyzwalacz/powiązanie Ponów próbę źródła Konfigurowanie
Azure Cosmos DB Zasady ponawiania prób Poziom funkcji
Azure Blob Storage Rozszerzenie powiązania host.json
Azure Event Grid Rozszerzenie powiązania Identyfikator subskrypcji
Azure Event Hubs Zasady ponawiania prób Poziom funkcji
Azure Queue Storage Rozszerzenie powiązania host.json
RabbitMQ Rozszerzenie powiązania Kolejka utraconych listów
Azure Service Bus Rozszerzenie powiązania Kolejka utraconych listów
Czasomierz Zasady ponawiania prób Poziom funkcji
Kafka Zasady ponawiania prób Poziom funkcji

Zasady ponawiania prób

Począwszy od wersji 3.x środowiska uruchomieniowego usługi Azure Functions, można zdefiniować zasady ponawiania prób dla czasomierza, platformy Kafka, usługi Event Hubs i wyzwalaczy usługi Azure Cosmos DB wymuszanych przez środowisko uruchomieniowe usługi Functions.

Zasady ponawiania prób informują środowisko uruchomieniowe o ponownym uruchomieniu nieudanego wykonania do momentu pomyślnego ukończenia lub osiągnięcia maksymalnej liczby ponownych prób.

Zasady ponawiania są oceniane, gdy funkcja czasomierza, platformy Kafka, usługi Event Hubs lub wyzwalanej przez usługę Azure Cosmos DB zgłasza nieuchwycony wyjątek. Najlepszym rozwiązaniem jest przechwycenie wszystkich wyjątków w kodzie i ponowne utworzenie wszelkich błędów, które mają spowodować ponowienie próby.

Ważne

Punkty kontrolne usługi Event Hubs nie zostaną zapisane do momentu zakończenia zasad ponawiania wykonania. Ze względu na to zachowanie postęp w określonej partycji jest wstrzymany do momentu zakończenia bieżącej partii.

Rozszerzenie usługi Event Hubs w wersji 5 obsługuje dodatkowe możliwości ponawiania prób na potrzeby interakcji między hostem usługi Functions a centrum zdarzeń. Aby uzyskać więcej informacji, zapoznaj się z clientRetryOptions sekcją w usłudze Event Hubs w pliku host.json .

Strategie dotyczące ponawiania prób

Można skonfigurować dwie strategie ponawiania, które są obsługiwane przez zasady:

Określony czas może upłynąć między poszczególnymi ponownymi próbami.

Maksymalna liczba ponownych prób

Maksymalną liczbę ponownych prób wykonania funkcji można skonfigurować przed awarią ostateczną. Bieżąca liczba ponownych prób jest przechowywana w pamięci wystąpienia.

Wystąpienie może mieć błąd między ponownymi próbami. Gdy wystąpienie nie powiedzie się podczas zasad ponawiania próby, liczba ponownych prób zostanie utracona. Jeśli wystąpią błędy wystąpień, wyzwalacz usługi Event Hubs może wznowić przetwarzanie i ponowić próbę wsadu w nowym wystąpieniu, a liczba ponownych prób zostanie zresetowana do zera. Wyzwalacz czasomierza nie jest wznawiany w nowym wystąpieniu.

To zachowanie oznacza, że maksymalna liczba ponownych prób jest najlepszym rozwiązaniem. W niektórych rzadkich przypadkach wykonanie może zostać ponowione więcej niż żądana maksymalna liczba razy. W przypadku wyzwalaczy czasomierza ponowne próby mogą być mniejsze niż maksymalna liczba żądana.

Przykłady ponawiania prób

Ponawianie prób na poziomie funkcji jest obsługiwane w przypadku następujących pakietów 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}");
}
Właściwości opis
MaxRetryCount Wymagany. Maksymalna dozwolona liczba ponownych prób na wykonanie funkcji. -1 oznacza, aby ponowić próbę na czas nieokreślony.
DelayInterval Opóźnienie, które jest używane między ponownych prób. Określ go jako ciąg w formacie HH:mm:ss.

Oto zasady ponawiania w pliku function.json :

{
    "disabled": false,
    "bindings": [
        {
            ....
        }
    ],
    "retry": {
        "strategy": "fixedDelay",
        "maxRetryCount": 4,
        "delayInterval": "00:00:10"
    }
}
właściwość function.json opis
Strategii Wymagany. Strategia ponawiania, która ma zostać użyta. Prawidłowe wartości to fixedDelay i exponentialBackoff.
maxRetryCount Wymagany. Maksymalna dozwolona liczba ponownych prób na wykonanie funkcji. -1 oznacza, aby ponowić próbę na czas nieokreślony.
delayInterval Opóźnienie, które jest używane między ponownymi próbami podczas korzystania ze fixedDelay strategii. Określ go jako ciąg w formacie HH:mm:ss.
minimumInterval Minimalne opóźnienie ponawiania próby podczas korzystania ze exponentialBackoff strategii. Określ go jako ciąg w formacie HH:mm:ss.
maximumInterval Maksymalne opóźnienie ponawiania próby podczas korzystania ze exponentialBackoff strategii. Określ go jako ciąg w formacie HH:mm:ss.

Oto przykład języka Python, który używa kontekstu ponawiania próby w funkcji:

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

Kody błędów powiązania

Podczas integracji z usługami platformy Azure błędy mogą pochodzić z interfejsów API bazowych usług. Informacje dotyczące błędów specyficznych dla powiązania są dostępne w sekcjach "Wyjątki i kody powrotne" w następujących artykułach:

Następne kroki