Tous les produits
Search
Centre de documentation

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

Dernière mise à jour :Aug 11, 2026

Dans les systèmes distribués, l'indisponibilité d'un seul service peut entraîner la propagation des défaillances à l'ensemble de votre infrastructure. Service Mesh (ASM) offre une tolérance aux pannes au niveau de l'infrastructure grâce à quatre mécanismes : le délai d'expiration, la nouvelle tentative, le cloisonnement et le disjoncteur. Vos applications gèrent ainsi les pannes partielles de manière élégante, sans modification du code.

ASM injecte des proxys sidecar à côté de vos services. Ces proxys interceptent tout le trafic entrant et sortant et appliquent des politiques de tolérance aux pannes au niveau réseau. Comme ces politiques sont configurées via des ressources personnalisées Istio (VirtualService et DestinationRule), le code de votre application reste épuré : aucune bibliothèque de nouvelles tentatives, aucun wrapper de délai d'expiration, aucun SDK de disjoncteur.

Mécanisme Fonction Configuré dans
Délai d'expiration Limite la durée d'attente d'une réponse pour une requête VirtualService
Nouvelle tentative Renvoie automatiquement les requêtes ayant échoué VirtualService
Cloisonnement Limite les connexions et les requêtes simultanées vers un service DestinationRule
Disjoncteur Exclut les hôtes défectueux du pool d'équilibrage de charge DestinationRule

Configurer un délai d'expiration

Sans délai d'expiration, une requête adressée à un service en amont qui ne répond pas bloque indéfiniment, ce qui consomme des ressources et peut bloquer l'appelant. La définition d'un délai d'expiration limite cette attente : si le service en amont ne répond pas dans la durée spécifiée, le proxy sidecar renvoie une erreur afin que l'appelant puisse exécuter une action de secours.

Une erreur de délai d'expiration ne signifie pas que l'opération en amont a échoué. L'opération peut toujours se terminer côté serveur. Un délai d'expiration signifie uniquement que l'appelant a cessé d'attendre.

Définissez le champ timeout sur une route dans un VirtualService. Ce délai d'expiration s'applique à toutes les requêtes correspondant à cette route.

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: httpbin
spec:
  hosts:
  - 'httpbin'
  http:
  - route:
    - destination:
        host: httpbin
    timeout: 5s
Champ Description
timeout Durée maximale pendant laquelle le proxy sidecar attend une réponse. Si le service en amont ne répond pas dans ce délai, le proxy renvoie une erreur à l'appelant.

Configurer une politique de nouvelles tentatives

Les défaillances transitoires, telles que les réinitialisations de connexion, les redémarrages brefs de service ou les perturbations réseau, se résolvent souvent d'elles-mêmes. Un mécanisme de nouvelle tentative renvoie automatiquement les requêtes ayant échoué, améliorant ainsi les taux de réussite sans intervention manuelle.

Important

Évitez les nouvelles tentatives excessives. Un nombre trop élevé de nouvelles tentatives ou des fenêtres de nouvelle tentative trop longues peuvent amplifier la charge sur un service déjà fragilisé et déclencher des défaillances en cascade. Associez toujours les nouvelles tentatives à un délai d'expiration au niveau de la route.

Définissez un bloc retries dans un VirtualService. L'exemple suivant effectue jusqu'à 3 nouvelles tentatives en cas d'échec ou de réinitialisation de la connexion, avec un délai d'expiration de 5 secondes par tentative :

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
Champ Description
attempts Nombre maximal de nouvelles tentatives pour une requête. Si un timeout est également défini au niveau de la route, les nouvelles tentatives s'arrêtent lorsque le temps total écoulé dépasse ce délai d'expiration, même si le nombre défini dans attempts n'a pas été atteint.
perTryTimeout Délai d'expiration pour chaque tentative individuelle. Prend en charge les millisecondes, les secondes, les minutes ou les heures.
retryOn Liste séparée par des virgules des conditions qui déclenchent une nouvelle tentative. Consultez les tableaux ci-dessous.

Conditions de nouvelle tentative HTTP

Condition Déclenchement de la nouvelle tentative
connect-failure Échec de la connexion au service en amont (par exemple, délai d'expiration de la connexion).
refused-stream Le service en amont renvoie une trame REFUSED_STREAM pour réinitialiser le flux.
reset Une déconnexion, une réinitialisation ou un délai d'expiration de lecture se produit avant que le service en amont ne réponde.
5xx Le service en amont renvoie un code d'état 5xx ou ne répond pas. Inclut connect-failure et refused-stream.
gateway-error Le service en amont renvoie un code d'état 502, 503 ou 504.
envoy-ratelimited La réponse contient un en-tête x-envoy-ratelimited.
retriable-4xx Le service en amont renvoie un code d'état 409.
retriable-status-codes Le service en amont renvoie un code d'état que vous avez explicitement ajouté à la valeur retryOn (par exemple, 403,404,retriable-status-codes).
retriable-headers Les en-têtes de réponse contiennent un en-tête répertorié dans l'en-tête de requête x-envoy-retriable-header-names. Par exemple, x-envoy-retriable-header-names: X-Upstream-Retry,X-Try-Again.

Conditions de nouvelle tentative gRPC

gRPC utilise HTTP/2 ; les conditions de nouvelle tentative gRPC sont donc définies dans le même champ retryOn.

Condition Code d'état gRPC
cancelled 1
unavailable 14
deadline-exceeded 4
internal 13
resource-exhausted 8

Configurer la politique de nouvelles tentatives par défaut

Par défaut, tous les services d'une instance ASM utilisent une politique de nouvelles tentatives intégrée pour les requêtes HTTP, même sans politique définie par VirtualService. Les valeurs par défaut sont les suivantes :

  • Retries : 2

  • Timeout : aucune

  • Conditions : connect-failure, refused-stream, unavailable, cancelled, retriable-status-codes

Remplacez ces valeurs par défaut via la console ASM :

Nécessite la version 1.15.3.120 d'ASM ou ultérieure. Pour les instructions de mise à jour, consultez Update an ASM instance .
  1. Connectez-vous à la console ASM. Dans le volet de navigation de gauche, choisissez Service Mesh > Mesh Management.

  2. Sur la page Mesh Management, cliquez sur le nom de l'instance ASM cible. Dans le volet de navigation de gauche, choisissez ASM Instance > Base Information.

  3. Dans la section Config Info de la page Base Information, cliquez sur Edit à côté de Default HTTP retry policy.

  4. Dans la boîte de dialogue Default HTTP retry policy, configurez les paramètres suivants et cliquez sur OK.

Paramètre Description
Retries Correspond au champ attempts. Définissez sur 0 pour désactiver globalement les nouvelles tentatives.
Timeout Correspond au champ perTryTimeout.
Retry On Correspond au champ retryOn.

Configurer un cloisonnement

Un appelant dysfonctionnant peut submerger un service en ouvrant trop de connexions ou en envoyant trop de requêtes simultanées. Le modèle de cloisonnement isole les ressources en limitant les connexions et les requêtes, empêchant ainsi un service de consommer toute la capacité disponible. Les requêtes dépassant le seuil reçoivent une erreur 503 immédiate au lieu d'être mises en file d'attente indéfiniment.

Bulkhead pattern

Définissez les limites du pool de connexions dans une DestinationRule. L'exemple suivant limite le service httpbin à 1 connexion simultanée, 1 requête par connexion et 1 requête en attente, avec un délai d'expiration de connexion de 10 secondes :

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
Champ S'applique à Description
maxConnections TCP, HTTP Nombre maximal de connexions simultanées vers le service en amont.
connectTimeout TCP, HTTP Durée maximale d'attente pour l'établissement d'une connexion. Renvoie une erreur 503 en cas de délai d'expiration.
http1MaxPendingRequests HTTP/1.1, HTTP/2, gRPC Nombre maximal de requêtes en attente mises en file d'attente pour une connexion.
maxRequestsPerConnection HTTP/1.1, HTTP/2, gRPC Nombre maximal de requêtes par connexion. Une fois cette limite atteinte, la connexion est fermée et une nouvelle est établie.

Configurer un disjoncteur

Si un hôte en amont commence à renvoyer systématiquement des erreurs, continuer à lui envoyer du trafic gaspille des ressources et augmente les taux d'erreur. Le disjoncteur détecte les hôtes défaillants et les retire temporairement (éjection) du pool d'équilibrage de charge. Après la période d'éjection, l'hôte est rajouté. Si les échecs persistent, les durées d'éjection augmentent progressivement : chaque éjection suivante dure plus longtemps que la précédente (baseEjectionTime x nombre d'éjections consécutives).

Circuit breaking

Définissez des règles de détection des anomalies dans une DestinationRule. L'exemple suivant éjecte un hôte du service httpbin s'il renvoie 3 erreurs consécutives dans n'importe quelle fenêtre de 5 secondes. L'hôte reste éjecté pendant au moins 5 minutes, et jusqu'à 100 % des hôtes peuvent être éjectés simultanément :

apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: httpbin
spec:
  host: httpbin
  trafficPolicy:
    outlierDetection:
      consecutiveErrors: 3
      interval: 5s
      baseEjectionTime: 5m
      maxEjectionPercent: 100
Champ Description
consecutiveErrors Nombre d'erreurs consécutives avant l'éjection d'un hôte.
interval Fenêtre temporelle pour la détection des erreurs consécutives.
baseEjectionTime Durée minimale d'éjection. La durée réelle = baseEjectionTime x nombre de fois où l'hôte a été éjecté consécutivement.
maxEjectionPercent Pourcentage maximal d'hôtes dans le pool d'équilibrage de charge pouvant être éjectés simultanément.

Surveiller le disjoncteur

Le disjoncteur au niveau de l'hôte génère des métriques Envoy qui vous aident à détecter quand des éjections se produisent.

Métrique Type Description
envoy_cluster_outlier_detection_ejections_active Gauge Nombre d'hôtes actuellement éjectés.
envoy_cluster_outlier_detection_ejections_enforced_total Counter Nombre total d'événements d'éjection.
envoy_cluster_outlier_detection_ejections_overflow Counter Nombre de tentatives d'éjection abandonnées car maxEjectionPercent a été atteint.
ejections_detected_consecutive_5xx Counter Nombre d'erreurs 5xx consécutives détectées sur un hôte.

Activer le reporting des métriques

Configurez proxyStatsMatcher sur le proxy sidecar pour rapporter les métriques du disjoncteur :

  1. Dans la configuration du proxy sidecar, sélectionnez proxyStatsMatcher, choisissez Regular Expression Match et définissez la valeur sur .*outlier_detection.*. Pour plus de détails, consultez la section proxyStatsMatcher dans Configure sidecar proxies.

  2. Redéployez les charges de travail qui utilisent le proxy sidecar. Pour plus de détails, consultez la section « Redeploy workloads » dans Configure sidecar proxies.

Configurer des alertes

Après avoir activé le reporting des métriques, configurez Prometheus pour collecter les métriques du disjoncteur et déclencher des alertes lors des éjections. L'exemple suivant utilise Managed Service for Prometheus.

  1. Dans Managed Service for Prometheus, connectez le cluster ACK sur le plan de données au composant Alibaba Cloud ASM ou mettez à jour le composant vers la dernière version. Cette étape garantit la collecte des métriques du disjoncteur. Pour plus de détails, consultez Manage components.

    Si vous collectez déjà les métriques ASM via une instance Prometheus autogérée (voir Monitor ASM instances by using a self-managed Prometheus instance ), ignorez cette étape.
  2. Créez une règle d'alerte pour le disjoncteur. Pour les instructions, consultez Use a custom PromQL statement to create an alert rule. Utilisez les paramètres suivants :

Paramètre Exemple Description
Custom PromQL statements (sum (envoy_cluster_outlier_detection_ejections_active) by (cluster_name, namespace)) > 0 Interroge si un hôte est actuellement éjecté, groupé par namespace et nom de service.
Alert message 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 }} Inclut le namespace, le nom du service et le nombre d'hôtes éjectés.

Références