Обработка ошибок службы "Функции Azure" и повторные попытки

Обработка ошибок в Функции Azure важна, чтобы избежать потери данных, избегать пропущенных событий и отслеживать работоспособность приложения. Это также важный способ понять поведение повторных попыток триггеров на основе событий.

В этой статье описываются общие стратегии обработки ошибок и доступные стратегии повтора.

Важно!

Мы удаляем поддержку политики повторных попыток в среде выполнения для триггеров, отличных от таймера, Kafka и Центров событий после того, как эта функция станет общедоступной. Поддержка политики повторных попыток предварительной версии для всех триггеров, отличных от таймера и Центров событий, была удалена в декабре 2022 года. Дополнительные сведения см. в разделе "Повторные попытки ".

Обработка ошибок

Ошибки, возникающие в функции Azure, могут привести к любым из следующих действий:

  • Использование встроенных триггеров и привязок в Функциях Azure.
  • Вызовы к API базовых служб Azure.
  • Вызовы конечных точек REST.
  • Вызовы клиентских библиотек, пакетов или сторонних API.

Чтобы избежать потери данных или пропущенных сообщений, важно использовать хорошую обработку ошибок. В этом разделе описаны некоторые рекомендуемые методики обработки ошибок и ссылки на дополнительные сведения.

Включить Application Insights

Функции Azure интегрируются с Application Insights для сбора данных об ошибках и производительности, а также журналов времени выполнения. Вы должны использовать приложение Аналитика для обнаружения и лучшего понимания ошибок, возникающих в выполнении функции. Дополнительные сведения см. в статье Мониторинг Функций Azure.

Использовать структурированную обработку ошибок

Записывать и вносить в журнал ошибки крайне важно для мониторинга работоспособности приложения. Самый верхний уровень кода функции должен включать блок try/catch. В блоке catch можно записывать и вносить в журнал ошибки. Сведения о том, какие ошибки могут возникать из-за привязок, см. в статье Коды ошибок привязки.

Планирование стратегии повтора

Встроенную поддержку повтора обеспечивают несколько расширений привязок Функций. Кроме того, среда выполнения позволяет определять политики повторных попыток для функций таймера, Kafka и центров событий. Дополнительные сведения см. в разделе Повторы. Для триггеров, которые не предоставляют поведения повторных попыток, может потребоваться реализовать собственную схему повторных попыток.

Учитывать идемпотентность при проектировании

Возникновение ошибок при обработке данных может быть проблемой для ваших функций, особенно при обработке сообщений. Важно учитывать, что происходит при возникновении ошибки и как избежать дублирования обработки. Дополнительные сведения см. в статье Проектирование Функций Azure для идентичных входных данных.

Повторы

Существует два типа повторных попыток, доступных для ваших функций:

  • Встроенное поведение повторных попыток отдельных расширений триггеров
  • Политики повторных попыток, предоставляемые средой выполнения Функций

В следующей таблице показано, какие триггеры поддерживают повторы и где настраивается поведение для повтора. Он также ссылается на дополнительные сведения об ошибках, поступающих из базовых служб.

Триггер/привязка Источник повтора Настройка
Azure Cosmos DB Политики повторных попыток уровень функции.
Хранилище BLOB-объектов Azure Расширение привязки host.json
Сетку событий Azure Расширение привязки Подписка на события
Центры событий Azure Политики повторных попыток уровень функции.
Хранилище очередей Azure Расширение привязки host.json
RabbitMQ Расширение привязки Очередь недоставленных сообщений
Служебная шина Azure Расширение привязки Очередь недоставленных сообщений
Таймер Политики повторных попыток уровень функции.
Kafka Политики повторных попыток уровень функции.

политики повтора;

Начиная с версии 3.x среды выполнения Функции Azure можно определить политики повторных попыток для таймера, Kafka, Центров событий и триггеров Azure Cosmos DB, которые применяются средой выполнения Функций.

Политика повтора сообщает среде выполнения о том, что при неудачном выполнении нужно повторять попытку, пока не получится добиться успеха или пока не будет достигнуто максимальное число повторов.

Политика повторных попыток оценивается, когда функция таймера, Kafka, Центров событий или запускаемая с помощью Azure Cosmos DB функция вызывает неученное исключение. Рекомендуется перехватывать все исключения в коде и повторно выдавать ошибки, которые должны привести к повторам.

Важно!

Центры событий проверка points не будут записываться до завершения политики повторных попыток выполнения. Из-за этого ход выполнения определенной секции приостанавливается до завершения текущего пакета.

Расширение Центров событий версии 5 поддерживает дополнительные возможности повторных попыток взаимодействия между узлом функций и концентратором событий. Дополнительные сведения см clientRetryOptions . в разделе "Центры событий" файла host.json .

Стратегия повторов

Вы можете настроить две стратегии повторных попыток, поддерживаемые политикой:

Между повторами должно пройти указанное время.

Максимальное число повторов

Можно настроить максимальное количество попыток выполнения функции до конечного сбоя. Текущее число повторных попыток хранится в памяти экземпляра.

Для экземпляра может возникнуть сбой между повторными попытками. При сбое экземпляра во время применения политики повтора число повторных попыток обнуляется. При возникновении сбоев экземпляра триггер Центров событий может возобновить обработку и повторить попытку для пакета на новом экземпляре, при этом счетчик повторов обнуляется. Триггер таймера не возобновляется в новом экземпляре.

Это означает, что максимальное количество повторных попыток — это лучшие усилия. В некоторых редких случаях выполнение может быть извлечено больше, чем запрошенное максимальное количество раз. Для триггеров таймера повторные попытки могут быть меньше, чем запрошенное максимальное число.

Примеры повторов

Повторные попытки на уровне функций поддерживаются со следующими пакетами 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}");
}
Свойство Description
MaxRetryCount Обязательно. Максимальное количество повторных попыток для каждой функции. -1 указывает на неограниченное число попыток.
DelayInterval Задержка, используемая между повторными попытками. Укажите его в виде строки с форматом HH:mm:ss.

Политика повтора в файле function.json:

{
    "disabled": false,
    "bindings": [
        {
            ....
        }
    ],
    "retry": {
        "strategy": "fixedDelay",
        "maxRetryCount": 4,
        "delayInterval": "00:00:10"
    }
}
Свойство в function.json Description
бизнеса Обязательно. Используемая стратегия повторных попыток. Допустимые значения — fixedDelay или exponentialBackoff.
maxRetryCount Обязательно. Максимальное количество повторных попыток для каждой функции. -1 указывает на неограниченное число попыток.
delayInterval Задержка, используемая между повторными попытками при использовании fixedDelay стратегии. Укажите его в виде строки с форматом HH:mm:ss.
minimumInterval Минимальная задержка повторных попыток при использовании exponentialBackoff стратегии. Укажите его в виде строки с форматом HH:mm:ss.
maximumInterval Максимальная задержка повторных попыток при использовании exponentialBackoff стратегии. Укажите его в виде строки с форматом HH:mm:ss.

Ниже приведен пример Python, использующий контекст повторных попыток в функции:

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

Коды ошибок привязки

При интеграции со службами Azure ошибки могут возникать из API базовых служб. Сведения, связанные с ошибками, связанными с привязкой, доступны в разделах "Исключения и коды возврата" в следующих статьях:

Следующие шаги