Em sistemas distribuídos, um único serviço sem resposta pode causar falhas em cascata por toda a sua infraestrutura. O Service Mesh (ASM) oferece tolerância a falhas no nível da infraestrutura por meio de quatro mecanismos: timeout, retry, bulkhead e circuit breaking. Assim, suas aplicações lidam com falhas parciais de forma elegante, sem necessidade de alterações no código.
O ASM injeta sidecar proxies ao lado dos seus serviços. Esses proxies interceptam todo o tráfego de entrada e saída e aplicam políticas de tolerância a falhas na camada de rede. Como as políticas são configuradas por meio de recursos personalizados do Istio (VirtualService e DestinationRule), o código da sua aplicação permanece limpo, sem bibliotecas de retry, wrappers de timeout ou SDKs de circuit breaker.
|
Mecanismo |
Função |
Configurado em |
|
Timeout |
Limita o tempo de espera de uma requisição por uma resposta |
VirtualService |
|
Retry |
Reenvia automaticamente requisições com falha |
VirtualService |
|
Bulkhead |
Restringe conexões simultâneas e requisições para um serviço |
DestinationRule |
|
Circuit breaking |
Remove hosts não saudáveis do pool de balanceamento de carga |
DestinationRule |
Configure um timeout
Sem um timeout, uma requisição para um serviço upstream sem resposta fica bloqueada indefinidamente, consumindo recursos e podendo travar o chamador. Definir um timeout estabelece um limite para essa espera: se o upstream não responder dentro da duração especificada, o sidecar proxy retorna um erro para que o chamador possa executar uma ação alternativa.
Um erro de timeout não significa que a operação no upstream falhou. A operação ainda pode ser concluída no lado do servidor. O timeout indica apenas que o chamador parou de esperar.
Defina o campo timeout em uma rota dentro de um VirtualService. Esse timeout se aplica a todas as requisições que correspondem a essa rota.
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: httpbin
spec:
hosts:
- 'httpbin'
http:
- route:
- destination:
host: httpbin
timeout: 5s
|
Campo |
Descrição |
|
|
Tempo máximo que o sidecar proxy aguarda por uma resposta. Caso o serviço upstream não responda dentro desse período, o proxy retorna um erro ao chamador. |
Configure uma política de retry
Falhas transitórias, como redefinições de conexão, reinícios breves de serviços ou problemas momentâneos de rede, costumam se resolver sozinhas. Um mecanismo de retry reenvia automaticamente as requisições com falha, aumentando as taxas de sucesso sem intervenção manual.
Evite retries excessivos. Muitas tentativas ou janelas de retry muito longas podem sobrecarregar ainda mais um serviço já instável e desencadear falhas em cascata. Sempre combine retries com um timeout no nível da rota.
Defina um bloco retries em um VirtualService. O exemplo abaixo tenta até 3 vezes em caso de falhas ou redefinições de conexão, com um timeout de 5 segundos por tentativa:
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: httpbin
spec:
hosts:
- 'httpbin'
http:
- route:
- destination:
host: httpbin
retries:
attempts: 3
perTryTimeout: 5s
retryOn: connect-failure,reset
|
Campo |
Descrição |
|
|
Número máximo de tentativas de retry para uma requisição. Se também houver um |
|
|
Timeout para cada tentativa individual de retry. Aceita milissegundos, segundos, minutos ou horas. |
|
|
Lista separada por vírgulas das condições que acionam um retry. Consulte as tabelas abaixo. |
Condições de retry HTTP
|
Condição |
Quando o retry é acionado |
|
|
Falha na conexão com o serviço upstream (por exemplo, timeout de conexão). |
|
|
O serviço upstream retorna um frame REFUSED_STREAM para redefinir o stream. |
|
|
Ocorre uma desconexão, redefinição ou timeout de leitura antes que o serviço upstream responda. |
|
|
O serviço upstream retorna um código de status 5xx ou não responde. Inclui |
|
|
O serviço upstream retorna um código de status 502, 503 ou 504. |
|
|
A resposta contém um cabeçalho |
|
|
O serviço upstream retorna um código de status 409. |
|
|
O serviço upstream retorna um código de status que você adicionou explicitamente ao valor de |
|
|
Os cabeçalhos de resposta contêm um cabeçalho listado no cabeçalho de requisição |
Condições de retry gRPC
Como o gRPC usa HTTP/2, as condições de retry para gRPC são definidas no mesmo campo retryOn.
|
Condição |
Código de status gRPC |
|
|
1 |
|
|
14 |
|
|
4 |
|
|
13 |
|
|
8 |
Configure a política de retry padrão
Por padrão, todos os serviços em uma instância do ASM utilizam uma política de retry integrada para requisições HTTP, mesmo sem uma política definida via VirtualService. Os valores padrão são:
Retries: 2
Timeout: nenhum
Conditions:
connect-failure,refused-stream,unavailable,cancelled,retriable-status-codes
Substitua esses padrões pelo console do ASM:
Requer a versão 1.15.3.120 ou posterior do ASM. Para instruções de atualização, consulte Atualizar uma instância do ASM .
Faça login no console do ASM. No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.
Na página Mesh Management, clique em nome da instância do ASM desejada. No painel de navegação à esquerda, escolha ASM Instance > Base Information.
Na seção Config Info da página Base Information, clique em Edit ao lado de Default HTTP retry policy.
Na caixa de diálogo Default HTTP retry policy, configure os parâmetros a seguir e clique em OK.
|
Parâmetro |
Descrição |
|
Retries |
Corresponde ao campo |
|
Timeout |
Corresponde ao campo |
|
Retry On |
Corresponde ao campo |
Configure um bulkhead
Um único chamador com comportamento inadequado pode sobrecarregar um serviço ao abrir conexões demais ou enviar muitas requisições simultâneas. O padrão bulkhead isola os recursos limitando as conexões e requisições, impedindo que um serviço consuma toda a capacidade disponível. Requisições que ultrapassam o limiar recebem imediatamente um erro 503, em vez de ficarem enfileiradas indefinidamente.

Defina limites de connection pool em um DestinationRule. O exemplo a seguir restringe o serviço httpbin a 1 conexão simultânea, 1 requisição por conexão e 1 requisição pendente, com um timeout de conexão de 10 segundos:
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: httpbin
spec:
host: httpbin
trafficPolicy:
connectionPool:
http:
http1MaxPendingRequests: 1
maxRequestsPerConnection: 1
tcp:
connectTimeout: 10s
maxConnections: 1
|
Campo |
Aplica-se a |
Descrição |
|
|
TCP, HTTP |
Quantidade máxima de conexões simultâneas com o serviço upstream. |
|
|
TCP, HTTP |
Tempo máximo de espera para estabelecer uma conexão. Retorna um erro 503 em caso de timeout. |
|
|
HTTP/1.1, HTTP/2, gRPC |
Número máximo de requisições pendentes enfileiradas para uma conexão. |
|
|
HTTP/1.1, HTTP/2, gRPC |
Limite de requisições por conexão. Ao atingir esse limite, a conexão é fechada e uma nova é estabelecida. |
Configure o circuit breaking
Se um host upstream começar a retornar erros consistentemente, continuar enviando tráfego para ele desperdiça recursos e aumenta as taxas de erro. O circuit breaking detecta hosts com falha e os remove (ejetam) temporariamente do pool de balanceamento de carga. Após o período de ejeção, o host é readicionado. Se as falhas persistirem, a duração das ejeções aumenta progressivamente — cada ejeção subsequente dura mais que a anterior (baseEjectionTime x número de ejeções consecutivas).

Defina regras de detecção de outliers em um DestinationRule. O exemplo abaixo ejeta um host do serviço httpbin se ele retornar 3 erros consecutivos dentro de qualquer janela de 5 segundos. O host permanece ejetado por pelo menos 5 minutos, e até 100% dos hosts podem ser ejetados simultaneamente:
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: httpbin
spec:
host: httpbin
trafficPolicy:
outlierDetection:
consecutiveErrors: 3
interval: 5s
baseEjectionTime: 5m
maxEjectionPercent: 100
|
Campo |
Descrição |
|
|
Quantidade de erros consecutivos antes que um host seja ejetado. |
|
|
Janela de tempo para detectar erros consecutivos. |
|
|
Duração mínima da ejeção. Duração real = |
|
|
Percentual máximo de hosts no pool de balanceamento de carga que podem ser ejetados ao mesmo tempo. |
Monitore o circuit breaking
O circuit breaking no nível de host gera métricas do Envoy que ajudam a detectar quando ocorrem ejeções.
|
Métrica |
Tipo |
Descrição |
|
|
Gauge |
Quantidade de hosts atualmente ejetados. |
|
|
Counter |
Total de eventos de ejeção. |
|
|
Counter |
Número de tentativas de ejeção abandonadas porque o |
|
|
Counter |
Quantidade de erros 5xx consecutivos detectados em um host. |
Ative o relatório de métricas
Configure o proxyStatsMatcher no sidecar proxy para relatar métricas de circuit breaking:
Na configuração do sidecar proxy, selecione
proxyStatsMatcher, escolha Regular Expression Match e defina o valor como.*outlier_detection.*. Para mais detalhes, consulte a seção proxyStatsMatcher em Configurar sidecar proxies.Reimplante as cargas de trabalho que usam o sidecar proxy. Para mais detalhes, consulte a seção "Reimplantar cargas de trabalho" em Configurar sidecar proxies.
Configure alertas
Após ativar o relatório de métricas, configure o Prometheus para coletar métricas de circuit breaking e disparar alertas quando ocorrerem ejeções. O exemplo a seguir utiliza o Managed Service for Prometheus.
-
No Managed Service for Prometheus, conecte o cluster ACK no plano de dados ao componente Alibaba Cloud ASM ou atualize o componente para a versão mais recente. Essa etapa garante a coleta das métricas de circuit breaking. Para mais detalhes, consulte Gerenciar componentes.
Se você já coleta métricas do ASM por meio de uma instância auto-gerenciada do Prometheus (consulte Monitorar instâncias do ASM usando uma instância auto-gerenciada do Prometheus ), pule esta etapa.
Crie uma regra de alerta para circuit breaking. Para instruções, consulte Usar uma instrução PromQL personalizada para criar uma regra de alerta. Utilize os seguintes parâmetros:
|
Parâmetro |
Exemplo |
Descrição |
|
Instruções PromQL personalizadas |
|
Consulta se algum host está atualmente ejetado, agrupado por namespace e nome do serviço. |
|
Mensagem de alerta |
|
Inclui o namespace, o nome do serviço e a quantidade de hosts ejetados. |
Referências
Referência do VirtualService do Istio — referência completa de campos para configuração de timeout e retry
Referência do DestinationRule do Istio — referência completa de campos para configuração de bulkhead e circuit breaking
Configurar sidecar proxies — gerencie as configurações de sidecar proxy para suas cargas de trabalho