Todos os produtos
Search
Central de documentação

Alibaba Cloud Service Mesh:Build fault-tolerant distributed systems with ASM

Última atualização: Jun 28, 2026

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

timeout

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.

Importante

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

attempts

Número máximo de tentativas de retry para uma requisição. Se também houver um timeout definido no nível da rota, os retries param quando o tempo total decorrido excede esse timeout, mesmo que o valor de attempts não tenha sido atingido.

perTryTimeout

Timeout para cada tentativa individual de retry. Aceita milissegundos, segundos, minutos ou horas.

retryOn

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

connect-failure

Falha na conexão com o serviço upstream (por exemplo, timeout de conexão).

refused-stream

O serviço upstream retorna um frame REFUSED_STREAM para redefinir o stream.

reset

Ocorre uma desconexão, redefinição ou timeout de leitura antes que o serviço upstream responda.

5xx

O serviço upstream retorna um código de status 5xx ou não responde. Inclui connect-failure e refused-stream.

gateway-error

O serviço upstream retorna um código de status 502, 503 ou 504.

envoy-ratelimited

A resposta contém um cabeçalho x-envoy-ratelimited.

retriable-4xx

O serviço upstream retorna um código de status 409.

retriable-status-codes

O serviço upstream retorna um código de status que você adicionou explicitamente ao valor de retryOn (por exemplo, 403,404,retriable-status-codes).

retriable-headers

Os cabeçalhos de resposta contêm um cabeçalho listado no cabeçalho de requisição x-envoy-retriable-header-names. Por exemplo, x-envoy-retriable-header-names: X-Upstream-Retry,X-Try-Again.

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

cancelled

1

unavailable

14

deadline-exceeded

4

internal

13

resource-exhausted

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 .
  1. Faça login no console do ASM. No painel de navegação à esquerda, escolha Service Mesh > Mesh Management.

  2. 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.

  3. Na seção Config Info da página Base Information, clique em Edit ao lado de Default HTTP retry policy.

  4. 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 attempts. Defina como 0 para desativar os retries globalmente.

Timeout

Corresponde ao campo perTryTimeout.

Retry On

Corresponde ao campo retryOn.

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.

Bulkhead pattern

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

maxConnections

TCP, HTTP

Quantidade máxima de conexões simultâneas com o serviço upstream.

connectTimeout

TCP, HTTP

Tempo máximo de espera para estabelecer uma conexão. Retorna um erro 503 em caso de timeout.

http1MaxPendingRequests

HTTP/1.1, HTTP/2, gRPC

Número máximo de requisições pendentes enfileiradas para uma conexão.

maxRequestsPerConnection

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).

Circuit breaking

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

consecutiveErrors

Quantidade de erros consecutivos antes que um host seja ejetado.

interval

Janela de tempo para detectar erros consecutivos.

baseEjectionTime

Duração mínima da ejeção. Duração real = baseEjectionTime x número de vezes que o host foi ejetado consecutivamente.

maxEjectionPercent

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

envoy_cluster_outlier_detection_ejections_active

Gauge

Quantidade de hosts atualmente ejetados.

envoy_cluster_outlier_detection_ejections_enforced_total

Counter

Total de eventos de ejeção.

envoy_cluster_outlier_detection_ejections_overflow

Counter

Número de tentativas de ejeção abandonadas porque o maxEjectionPercent foi atingido.

ejections_detected_consecutive_5xx

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:

  1. 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.

  2. 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.

  1. 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.
  2. 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

(sum (envoy_cluster_outlier_detection_ejections_active) by (cluster_name, namespace)) > 0

Consulta se algum host está atualmente ejetado, agrupado por namespace e nome do serviço.

Mensagem de alerta

Host-level circuit breaking is triggered. Some workloads encounter errors repeatedly and the hosts are ejected from the load balancing pool. Namespace: {$labels.namespace}}, Service where the host ejection occurs: {{$labels.cluster_name}}. Number of hosts that are ejected: {{ $value }}

Inclui o namespace, o nome do serviço e a quantidade de hosts ejetados.

Referências