Resiliência da descoberta de serviço (visualização)
Com a resiliência dos Aplicativos de Contêiner do Azure, você pode prevenir, detetar e recuperar proativamente falhas de solicitação de serviço usando políticas de resiliência simples. Neste artigo, você aprenderá a configurar as políticas de resiliência dos Aplicativos de Contêiner do Azure ao iniciar solicitações usando a descoberta de serviço de Aplicativos de Contêiner do Azure.
Nota
Atualmente, as políticas de resiliência não podem ser aplicadas a solicitações feitas usando a API de invocação de serviço Dapr.
As políticas estão em vigor para cada solicitação para um aplicativo de contêiner. Você pode adaptar as políticas ao aplicativo contêiner aceitando solicitações com configurações como:
- O número de novas tentativas
- Duração da repetição e do tempo limite
- Repetir correspondências
- Erros consecutivos do disjuntor, entre outros
A captura de tela a seguir mostra como um aplicativo usa uma política de repetição para tentar se recuperar de solicitações com falha.
Políticas de resiliência suportadas
Configurar políticas de resiliência
Quer configure políticas de resiliência utilizando o Bicep, a CLI ou o portal do Azure, só pode aplicar uma política por aplicação de contentor.
Quando você aplica uma política a um aplicativo de contêiner, as regras são aplicadas a todas as solicitações feitas a esse aplicativo de contêiner, não a solicitações feitas a partir desse aplicativo de contêiner. Por exemplo, uma política de repetição é aplicada a um aplicativo de contêiner chamado App B
. Todas as solicitações de entrada feitas ao Aplicativo B são repetidas automaticamente em caso de falha. No entanto, não é garantido que as solicitações de saída enviadas pelo aplicativo B tentem novamente em caso de falha.
O exemplo de resiliência a seguir demonstra todas as configurações disponíveis.
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
}
}
}
Especificações da política
Tempos limite
Os tempos limite são usados para encerrar antecipadamente operações de longa duração. A política de tempo limite inclui as seguintes propriedades.
properties: {
timeoutPolicy: {
responseTimeoutInSeconds: 15
connectionTimeoutInSeconds: 5
}
}
Metadados | Necessário | Description | Exemplo |
---|---|---|---|
responseTimeoutInSeconds |
Sim | Tempo limite aguardando uma resposta do aplicativo contêiner. | 15 |
connectionTimeoutInSeconds |
Sim | Tempo limite para estabelecer uma conexão com o aplicativo contêiner. | 5 |
Tentativas
Defina uma tcpRetryPolicy
ou uma httpRetryPolicy
estratégia para operações com falha. A política de repetição inclui as seguintes configurações.
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'
]
}
}
}
Metadados | Necessário | Description | Exemplo |
---|---|---|---|
maxRetries |
Sim | Máximo de tentativas a serem executadas para uma solicitação http com falha. | 5 |
retryBackOff |
Sim | Monitore as solicitações e desligue todo o tráfego para o serviço afetado quando os critérios de tempo limite e repetição forem atendidos. | N/A |
retryBackOff.initialDelayInMilliseconds |
Sim | Atraso entre o primeiro erro e a primeira tentativa. | 1000 |
retryBackOff.maxIntervalInMilliseconds |
Sim | Atraso máximo entre tentativas. | 10000 |
matches |
Sim | Defina os valores de correspondência para limitar quando o aplicativo deve tentar uma nova tentativa. | headers , httpStatusCodes , errors |
matches.headers |
Y* | Tente novamente quando a resposta de erro incluir um cabeçalho específico. *Os cabeçalhos só são propriedades necessárias se você especificar a retriable-headers propriedade error. Saiba mais sobre as correspondências de cabeçalho disponíveis. |
X-Content-Type |
matches.httpStatusCodes |
Y* | Tente novamente quando a resposta retornar um código de status específico. *Os códigos de status só são propriedades necessárias se você especificar a retriable-status-codes propriedade error. |
502 , 503 |
matches.errors |
Sim | Só tenta novamente quando o aplicativo retorna um erro específico. Saiba mais sobre os erros disponíveis. | connect-failure , reset |
Correspondências de cabeçalho
Se você especificou o retriable-headers
erro, pode usar as seguintes propriedades de correspondência de cabeçalho para tentar novamente quando a resposta incluir um cabeçalho específico.
matches: {
headers: [
{
header: 'x-ms-retriable'
match: {
exactMatch: 'true'
}
}
]
}
Metadados | Description |
---|---|
prefixMatch |
As novas tentativas são realizadas com base no prefixo do valor do cabeçalho. |
exactMatch |
As novas tentativas são realizadas com base em uma correspondência exata do valor do cabeçalho. |
suffixMatch |
As novas tentativas são realizadas com base no sufixo do valor do cabeçalho. |
regexMatch |
As novas tentativas são realizadas com base em uma regra de expressão regular em que o valor do cabeçalho deve corresponder ao padrão regex. |
Erros
Você pode executar novas tentativas em qualquer um dos seguintes erros:
matches: {
errors: [
'retriable-headers'
'retriable-status-codes'
'5xx'
'reset'
'connect-failure'
'retriable-4xx'
]
}
Metadados | Description |
---|---|
retriable-headers |
Cabeçalhos de resposta HTTP que acionam uma nova tentativa. Uma nova tentativa é executada se qualquer uma das correspondências de cabeçalho corresponder aos cabeçalhos de resposta. Obrigatório se você quiser tentar novamente em qualquer cabeçalho correspondente. |
retriable-status-codes |
Códigos de status HTTP que devem disparar tentativas. Obrigatório se você quiser repetir os códigos de status correspondentes. |
5xx |
Tente novamente se o servidor responder com qualquer código de resposta 5xx. |
reset |
Tente novamente se o servidor não responder. |
connect-failure |
Tente novamente se uma solicitação falhar devido a uma conexão defeituosa com o aplicativo contêiner. |
retriable-4xx |
Tente novamente se o aplicativo contêiner responder com um código de resposta da série 400, como 409 . |
tcpRetryPolicy
properties: {
tcpRetryPolicy: {
maxConnectAttempts: 3
}
}
Metadados | Necessário | Description | Exemplo |
---|---|---|---|
maxConnectAttempts |
Sim | Defina o máximo de tentativas de conexão (maxConnectionAttempts ) para tentar novamente em conexões com falha. |
3 |
Disjuntores
As políticas de disjuntor especificam se uma réplica de aplicativo de contêiner é temporariamente removida do pool de balanceamento de carga, com base em gatilhos como o número de erros consecutivos.
properties: {
circuitBreakerPolicy: {
consecutiveErrors: 5
intervalInSeconds: 10
maxEjectionPercent: 50
}
}
Metadados | Necessário | Description | Exemplo |
---|---|---|---|
consecutiveErrors |
Sim | Número consecutivo de erros antes que uma réplica de aplicativo de contêiner seja temporariamente removida do balanceamento de carga. | 5 |
intervalInSeconds |
Sim | A quantidade de tempo dada para determinar se uma réplica é removida ou restaurada do pool de balanceamento de carga. | 10 |
maxEjectionPercent |
Sim | Porcentagem máxima de réplicas de aplicativos de contêiner com falha a serem ejetadas do balanceamento de carga. Remove pelo menos um host, independentemente do valor. | 50 |
Pools de conexões
O pool de conexões do Aplicativo de Contêiner do Azure mantém um pool de conexões estabelecidas e reutilizáveis para aplicativos de contêiner. Esse pool de conexões reduz a sobrecarga de criar e derrubar conexões individuais para cada solicitação.
Os pools de conexões permitem especificar o número máximo de solicitações ou conexões permitidas para um serviço. Esses limites controlam o número total de conexões simultâneas para cada serviço. Quando esse limite é atingido, novas conexões não são estabelecidas para esse serviço até que as conexões existentes sejam liberadas ou fechadas. Esse processo de gerenciamento de conexões evita que os recursos sejam sobrecarregados por solicitações e mantém o gerenciamento eficiente de conexões.
httpConnectionPool
properties: {
httpConnectionPool: {
http1MaxPendingRequests: 1024
http2MaxRequests: 1024
}
}
Metadados | Necessário | Description | Exemplo |
---|---|---|---|
http1MaxPendingRequests |
Sim | Usado para http1 solicitações. Número máximo de conexões abertas para um aplicativo de contêiner. |
1024 |
http2MaxRequests |
Sim | Usado para http2 solicitações. Número máximo de solicitações simultâneas para um aplicativo de contêiner. |
1024 |
tcpConnectionPool
properties: {
tcpConnectionPool: {
maxConnections: 100
}
}
Metadados | Necessário | Description | Exemplo |
---|---|---|---|
maxConnections |
Sim | Número máximo de conexões simultâneas com um aplicativo de contêiner. | 100 |
Observabilidade da resiliência
Você pode realizar a observabilidade de resiliência por meio das métricas e logs do sistema do seu aplicativo de contêiner.
Logs de resiliência
Na seção Monitoramento do seu aplicativo de contêiner, selecione Logs.
No painel Logs, escreva e execute uma consulta para encontrar resiliência por meio dos logs do sistema do aplicativo contêiner. Por exemplo, execute uma consulta semelhante à seguinte para procurar eventos de resiliência e mostrar os seus:
- Carimbo de data/hora
- Nome do ambiente
- Nome do aplicativo de contêiner
- Tipo de resiliência e razão
- Registrar mensagens
ContainerAppSystemLogs_CL
| where EventSource_s == "Resiliency"
| project TimeStamp_s, EnvironmentName_s, ContainerAppName_s, Type_s, EventSource_s, Reason_s, Log_s
Clique em Executar para executar a consulta e exibir os resultados.
Métricas de resiliência
No menu Monitoramento do seu aplicativo de contêiner, selecione Métricas. No painel Métricas, selecione os seguintes filtros:
- O escopo para o nome do seu aplicativo de contêiner.
- O namespace de métricas padrão .
- As métricas de resiliência no menu suspenso.
- Como pretende que os dados sejam agregados nos resultados (por média, por máximo, etc.).
- A duração do tempo (últimos 30 minutos, últimas 24 horas, etc.).
Por exemplo, se você definir a métrica Repetições de solicitação de resiliência no escopo do aplicativo de teste com Agregação média para pesquisar dentro de um período de tempo de 30 minutos, os resultados terão a seguinte aparência:
Conteúdos relacionados
Veja como funciona a resiliência para componentes Dapr em Aplicativos de Contêiner do Azure.