Поделиться через


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

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

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

Внимание

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

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

Ошибки, возникающие в функции Azure, могут возникать из:

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

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

Рекомендация Сведения
Включить Application Insights Функции Azure интегрируются с Application Insights для сбора данных об ошибках и производительности, а также журналов времени выполнения. Вы должны использовать приложение Аналитика для обнаружения и лучшего понимания ошибок, возникающих в выполнении функции. Дополнительные сведения см. в статье Мониторинг Функций Azure.
Использовать структурированную обработку ошибок Записывать и вносить в журнал ошибки крайне важно для мониторинга работоспособности приложения. Самый верхний уровень кода функции должен включать блок try/catch. В блоке catch можно записывать и вносить в журнал ошибки. Сведения о том, какие ошибки могут возникать из-за привязок, см. в статье Коды ошибок привязки. В зависимости от конкретной стратегии повторных попыток можно также вызвать новое исключение для повторного запуска функции.
Планирование стратегии повторных попыток Несколько расширений привязок функций обеспечивают встроенную поддержку повторных попыток, а другие позволяют определять политики повторных попыток, которые реализуются средой выполнения Функций. Для триггеров, которые не предоставляют поведения повторных попыток, следует рассмотреть возможность реализации собственной схемы повторных попыток. Дополнительные сведения см. в разделе "Повторные попытки".
Учитывать идемпотентность при проектировании Возникновение ошибок при обработке данных может быть проблемой для ваших функций, особенно при обработке сообщений. Важно учитывать, что происходит при возникновении ошибки и как избежать дублирования обработки. Дополнительные сведения см. в статье Проектирование Функций Azure для идентичных входных данных.

Повторы

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

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

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

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

*Требуется версия 5.x расширения Служебная шина Azure. В более ранних версиях расширения поведение повторных попыток реализуется служебная шина очереди недоставленных писем.

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

Функции Azure позволяет определять политики повторных попыток для определенных типов триггеров, которые применяются средой выполнения. В настоящее время эти типы триггеров поддерживают политики повторных попыток:

Поддержка повторных попыток одинакова для моделей программирования Python версии 1 и версии 2.

Политики повторных попыток не поддерживаются в среде выполнения Функций версии 1.x.

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

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

Внимание

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

Расширение Центров событий версии 5.x поддерживает дополнительные возможности повторных попыток взаимодействия между узлом Функций и концентратором событий. Дополнительные сведения см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"
    }
}

Эти свойства можно задать для определений политик повторных попыток:

Свойство Description
бизнеса Обязательный. Используемая стратегия повторных попыток. Допустимые значения — fixedDelay или exponentialBackoff.
maxRetryCount Обязательный. Максимальное количество повторных попыток для каждой функции. -1 указывает на неограниченное число попыток.
delayInterval Задержка, используемая между повторными попытками при использовании fixedDelay стратегии. Укажите его в виде строки с форматом HH:mm:ss.
minimumInterval Минимальная задержка повторных попыток при использовании exponentialBackoff стратегии. Укажите его в виде строки с форматом HH:mm:ss.
maximumInterval Максимальная задержка повторных попыток при использовании exponentialBackoff стратегии. Укажите его в виде строки с форматом HH:mm:ss.

Способ определения политики повторных попыток для триггера зависит от версии Node.js.

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

const { app } = require('@azure/functions');

app.timer('timerTriggerWithRetry', {
    schedule: '0 */5 * * * *',
    retry: {
        strategy: 'fixedDelay',
        delayInterval: {
            seconds: 10,
        },
        maxRetryCount: 4,
    },
    handler: (myTimer, context) => {
        if (context.retryContext?.retryCount < 2) {
            throw new Error('Retry!');
        } else {
            context.log('Timer function processed request.');
        }
    },
});

Способ определения политики повторных попыток для триггера зависит от версии Node.js.

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

import { app, InvocationContext, Timer } from '@azure/functions';

export async function timerTriggerWithRetry(myTimer: Timer, context: InvocationContext): Promise<void> {
    if (context.retryContext?.retryCount < 2) {
        throw new Error('Retry!');
    } else {
        context.log('Timer function processed request.');
    }
}

app.timer('timerTriggerWithRetry', {
    schedule: '0 */5 * * * *',
    retry: {
        strategy: 'fixedDelay',
        delayInterval: {
            seconds: 10,
        },
        maxRetryCount: 4,
    },
    handler: timerTriggerWithRetry,
});

Эти свойства можно задать для определений политик повторных попыток:

Свойство Description
бизнеса Обязательный. Используемая стратегия повторных попыток. Допустимые значения — fixedDelay или exponentialBackoff.
maxRetryCount Обязательный. Максимальное количество повторных попыток для каждой функции. -1 указывает на неограниченное число попыток.
delayInterval Задержка, используемая между повторными попытками при использовании fixedDelay стратегии. Укажите его в виде строки с форматом HH:mm:ss.
minimumInterval Минимальная задержка повторных попыток при использовании exponentialBackoff стратегии. Укажите его в виде строки с форматом HH:mm:ss.
maximumInterval Максимальная задержка повторных попыток при использовании exponentialBackoff стратегии. Укажите его в виде строки с форматом HH:mm:ss.

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

import logging

from azure.functions import AuthLevel, Context, FunctionApp, TimerRequest

app = FunctionApp(http_auth_level=AuthLevel.ANONYMOUS)


@app.timer_trigger(schedule="*/1 * * * * *", arg_name="mytimer",
                   run_on_startup=False,
                   use_monitor=False)
@app.retry(strategy="fixed_delay", max_retry_count="3",
           delay_interval="00:00:01")
def mytimer(mytimer: TimerRequest, context: 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.info(
            f"Max retries of {context.retry_context.max_retry_count} for "
            f"function {context.function_name} has been reached")
    else:
        raise Exception("This is a retryable exception")

Эти свойства можно задать для определений политик повторных попыток:

Свойство Description
бизнеса Обязательный. Используемая стратегия повторных попыток. Допустимые значения — fixed_delay или exponential_backoff.
max_retry_count Обязательный. Максимальное количество повторных попыток для каждой функции. -1 указывает на неограниченное число попыток.
delay_interval Задержка, используемая между повторными попытками при использовании fixed_delay стратегии. Укажите его в виде строки с форматом HH:mm:ss.
minimum_interval Минимальная задержка повторных попыток при использовании exponential_backoff стратегии. Укажите его в виде строки с форматом HH:mm:ss.
maximum_interval Максимальная задержка повторных попыток при использовании exponential_backoff стратегии. Укажите его в виде строки с форматом HH:mm:ss.
@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 базовых служб. Сведения, связанные с ошибками, связанными с привязкой, доступны в разделах "Исключения и коды возврата" в следующих статьях:

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