Устойчивость обнаружения сервисов (предварительная версия)

Благодаря устойчивости приложений контейнеров Azure можно заранее предотвращать, обнаруживать и восстанавливать сбои запросов на обслуживание с помощью простых политик устойчивости. Из этой статьи вы узнаете, как настроить политики отказоустойчивости Контейнеры приложений Azure при инициации запросов с использованием обнаружения служб Контейнеры приложений Azure.

Примечание.

В настоящее время нельзя применять политики устойчивости к запросам, сделанным с помощью API вызова службы Dapr.

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

  • Количество повторных попыток
  • Длительность повтора и времени ожидания
  • Повторная попытка сопоставления
  • Последовательные ошибки разбиения цепи и другие

На следующем снимку экрана показано, как приложение использует политику повторных попыток для восстановления после неудачных запросов.

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

Поддерживаемые политики устойчивости

Настройка политик устойчивости

Независимо от того, настраиваете ли политики устойчивости с помощью Bicep, интерфейса командной строки или портала Azure, можно применять только одну политику для каждого приложения контейнера.

При применении политики к приложению-контейнеру правила применяются ко всем запросам, сделанным к приложению контейнера, а не к запросам, сделанным из этого приложения контейнера. Например, политика повторных попыток применяется к приложению-контейнеру с именем App B. Все входящие запросы, сделанные в App B, автоматически отправляются повторно в случае сбоя. Однако исходящие запросы, отправленные приложением B, не гарантируют повторную попытку в случае сбоя.

В следующем примере устойчивости показаны все доступные конфигурации.

resource myPolicyDoc 'Microsoft.App/containerApps/resiliencyPolicies@2023-11-02-preview' = {
  name: 'my-app-resiliency-policies'
  parent: '${appName}'
  properties: {
    timeoutPolicy: {
        responseTimeoutInSeconds: 15
        connectionTimeoutInSeconds: 5
    }
    httpRetryPolicy: {
        maxRetries: 5
        retryBackOff: {
          initialDelayInMilliseconds: 1000
          maxIntervalInMilliseconds: 10000
        }
        matches: {
            headers: [
                {
                    header: 'x-ms-retriable'
                    match: { 
                        exactMatch: 'true'
                    }
                }
            ]
            httpStatusCodes: [
                502
                503
            ]
            errors: [
                'retriable-status-codes'
                '5xx'
                'reset'
                'connect-failure'
                'retriable-4xx'
            ]
        }
    } 
    tcpRetryPolicy: {
        maxConnectAttempts: 3
    }
    circuitBreakerPolicy: {
        consecutiveErrors: 5
        intervalInSeconds: 10
        maxEjectionPercent: 50
    }
    tcpConnectionPool: {
        maxConnections: 100
    }
    httpConnectionPool: {
        http1MaxPendingRequests: 1024
        http2MaxRequests: 1024
    }
  }
}

Спецификации политик

Время ожидания

Таймауты прерывают длительные операции. Политика времени ожидания включает следующие свойства.

properties: {
  timeoutPolicy: {
      responseTimeoutInSeconds: 15
      connectionTimeoutInSeconds: 5
  }
}
Метаданные Обязательное поле Описание Пример
responseTimeoutInSeconds Да Время ожидания ответа от контейнерного приложения. 15
connectionTimeoutInSeconds Да Время ожидания для установления подключения к приложению-контейнеру. 5

Повторные попытки

Определите tcpRetryPolicy или стратегию httpRetryPolicy для неудачных операций. Политика повторных попыток включает следующие конфигурации.

Политика повторных попыток HTTP (HttpRetryPolicy)

properties: {
    httpRetryPolicy: {
        maxRetries: 5
        retryBackOff: {
          initialDelayInMilliseconds: 1000
          maxIntervalInMilliseconds: 10000
        }
        matches: {
            headers: [
                {
                    header: 'x-ms-retriable'
                    match: { 
                       exactMatch: 'true'
                    }
                }
            ]
            httpStatusCodes: [
                502
                503
            ]
            errors: [
                'retriable-headers'
                'retriable-status-codes'
            ]
        }
    } 
}
Метаданные Обязательное поле Описание Пример
maxRetries Да Максимальное количество повторных попыток для неудачного HTTP-запроса. 5
retryBackOff Да Отслеживайте запросы и отключите весь трафик к затронутой службе при выполнении условий ожидания и повторных попыток. Н/П
retryBackOff.initialDelayInMilliseconds Да Задержка между первой ошибкой и первой попыткой. 1000
retryBackOff.maxIntervalInMilliseconds Да Максимальная задержка между повторными попытками. 10000
matches Да Задайте значения соответствия, чтобы ограничить, когда приложение должно попытаться повторить попытку. headers, httpStatusCodes, errors
matches.headers Да* Повторите попытку, если ответ на ошибку содержит определенный заголовок. *Заголовки обязательны только в случае указания свойства ошибки retriable-headers. Узнайте больше о доступных соответствиях заголовков. X-Content-Type
matches.httpStatusCodes Да* Повторите попытку, когда ответ возвращает определенный код состояния. *Коды состояния являются обязательными свойствами, если вы укажете свойство ошибки retriable-status-codes. 502, 503
matches.errors Да Повторные попытки осуществляются только в случае возвращения приложением определенной ошибки. Узнайте больше о имеющихся ошибках. connect-failure, reset
Совпадения заголовков

Если указать ошибку retriable-headers , можно использовать следующие свойства сопоставления заголовков, чтобы повторить попытку, если ответ включает определенный заголовок.

matches: {
  headers: [
    { 
      header: 'x-ms-retriable'
      match: {
        exactMatch: 'true'
      }
    }
  ]
}
Метаданные Описание
prefixMatch Повторные попытки выполняются на основе префикса значения заголовка.
exactMatch Повторные попытки выполняются на основе точного соответствия значения заголовка.
suffixMatch Повторные попытки выполняются на основе суффикса значения заголовка.
regexMatch Повторные попытки выполняются на основе правила регулярного выражения, в котором значение заголовка должно соответствовать шаблону regex.
ошибки

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

matches: {
  errors: [
    'retriable-headers'
    'retriable-status-codes'
    '5xx'
    'reset'
    'connect-failure'
    'retriable-4xx'
  ]
}
Метаданные Описание
retriable-headers Заголовки ответа HTTP, которые активируют повторную попытку. Повтор выполняется, если любое из совпадений заголовков соответствует заголовкам ответа. Требуется, если вы хотите повторить попытку в любых соответствующих заголовках.
retriable-status-codes Коды состояния HTTP, которые должны активировать повторные попытки. Требуется, если вы хотите повторить попытку по любым совпадающим кодам состояния.
5xx Повторите попытку, если сервер отвечает с любым из кодов ответа 5xx.
reset Повторите попытку, если сервер не отвечает.
connect-failure Повторите попытку, если запрос завершился сбоем из-за сбоя подключения к приложению контейнера.
retriable-4xx Повторите попытку, если приложение-контейнер отвечает с кодом ответа серии 400, например 409.

tcpRetryPolicy

properties: {
    tcpRetryPolicy: {
        maxConnectAttempts: 3
    }
}
Метаданные Обязательное поле Описание Пример
maxConnectAttempts Да Задайте максимальное количество попыток подключения (maxConnectionAttempts) для повторных попыток при неудачных подключениях. 3

Выключатели

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

properties: {
    circuitBreakerPolicy: {
        consecutiveErrors: 5
        intervalInSeconds: 10
        maxEjectionPercent: 50
    }
}
Метаданные Обязательное поле Описание Пример
consecutiveErrors Да Количество последовательных ошибок, после которых реплика приложения-контейнера временно удаляется из балансировки нагрузки. 5
intervalInSeconds Да Время, выделенное для определения того, удаляется ли реплика из пула балансировки нагрузки или восстанавливается в него. 10
maxEjectionPercent Да Максимальный процент неработоспособных реплик контейнерного приложения для исключения из процесса балансировки нагрузки. Удаляет как минимум одного хоста независимо от заданного параметра. 50

Пулы подключений

Пул подключений Контейнеры приложений Azure поддерживает набор установленных и повторно используемых подключений к контейнерным приложениям. Этот пул подключений снижает затраты на создание и разрыв отдельных подключений для каждого запроса.

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

пул HTTP-соединений

properties: {
    httpConnectionPool: {
        http1MaxPendingRequests: 1024
        http2MaxRequests: 1024
    }
}
Метаданные Обязательное поле Описание Пример
http1MaxPendingRequests Да Используется для http1 запросов. Максимальное количество открытых подключений к приложению-контейнеру. 1024
http2MaxRequests Да Используется для http2 запросов. Максимальное количество одновременных запросов к приложению-контейнеру. 1024

пул TCP соединений

properties: {
    tcpConnectionPool: {
        maxConnections: 100
    }
}
Метаданные Обязательное поле Описание Пример
maxConnections Да Максимальное количество одновременных подключений к приложению-контейнеру. 100

Примечание.

Если вы не устанавливаете maxConnections, по умолчанию действует максимум 10 240 одновременных соединений. Настройте maxConnections повышение или снижение этого лимита для вашего контейнерного приложения.

Наблюдаемость устойчивости

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

Журналы устойчивости

В разделе Мониторинг приложения-контейнера выберите Журналы.

Снимок экрана, показывающий, где найти журналы для приложения-контейнера.

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

  • Отметка времени
  • Имя среды
  • Имя приложения-контейнера
  • Тип устойчивости и причина
  • Лог-сообщения
ContainerAppSystemLogs_CL
| where EventSource_s == "Resiliency"
| project TimeStamp_s, EnvironmentName_s, ContainerAppName_s, Type_s, EventSource_s, Reason_s, Log_s

Выберите "Выполнить" , чтобы запустить запрос и просмотреть результаты.

Снимок экрана: результаты запроса устойчивости на основе предоставленного примера запроса.

Метрики устойчивости

В меню "Мониторинг" приложения-контейнера выберите Метрики. В области метрик выберите следующие фильтры:

  • Область применения имени вашего контейнерного приложения.
  • Пространство имен метрик Standard metrics.
  • Метрики устойчивости из раскрывающегося меню.
  • Как вы хотите, чтобы данные агрегировались в результатах (по среднему, по максимальному значению и т. д.).
  • Длительность времени (например, последние 30 минут или последние 24 часа).

Снимок экрана: доступ к фильтрам метрик устойчивости для приложения-контейнера.

Например, если вы задали метрику "Запрос на устойчивость" в области тестового приложения со средней агрегацией для поиска в течение 30-минутного интервала времени, результаты выглядят следующим образом:

Снимок экрана: результаты из примеров фильтров метрик для обеспечения устойчивости.

Узнайте, как работает устойчивость компонентов Dapr в приложениях контейнеров Azure.