Guide d'architecture logicielle

Budgets de latence des systèmes distribués : concevoir, mesurer, appliquer

Un budget de latence fait de la performance une contrainte architecturale : chaque périphérie, service, dépendance, nouvelle tentative et file d'attente reçoit une part explicite du temps d'attente acceptable pour l'utilisateur.

Publié le
Mis à jour le
Temps de lecture
23 min de lecture
Sur cette page

La latence est une propriété d'un parcours de bout en bout, et non d'un unique service rapide. Un paiement qui commence dans un navigateur, traverse une périphérie, appelle trois services, attend une base de données et émet un événement peut manquer son objectif côté utilisateur même lorsque chaque équipe affiche un temps de réponse moyen respectable.

Un budget de latence transforme ce problème vague en outil de conception. Partez d'un résultat utilisateur, fixez un objectif fondé sur un percentile, allouez du temps aux étapes réellement sur le chemin critique et conservez une marge pour les variations et la gestion des défaillances. Le résultat n'est pas la promesse que chaque requête sera rapide. C'est un cadre de décision partagé par l'ingénierie, les opérations et les fournisseurs.

Cette discipline compte encore davantage dès que le chemin d'une requête traverse plusieurs fournisseurs qu'aucune équipe unique ne maîtrise de bout en bout. Un orchestrateur d'edge managé se place devant l'origine précisément pour que ce cadre de décision reste applicable à travers les fournisseurs DNS, edge et origine, plutôt que de laisser chacun défendre uniquement sa propre tranche du parcours ; les budgets de latence des systèmes distribués sont la manière dont cet orchestrateur met chaque équipe d'accord, avant même qu'un incident ne survienne, sur l'endroit où le temps est autorisé à s'écouler.

Budgétez la queue de distribution, pas la moyenne

Les moyennes masquent les files d'attente, les chemins à froid, les pertes de paquets et les blocages de dépendances. Définissez les objectifs de parcours avec des percentiles tels que p95 ou p99, puis examinez les distributions par région, route, état du cache et dépendance plutôt que de considérer un unique chiffre mondial comme une preuve.

Scénario fil rouge : la recherche chez Acme Shop

Prenons un scénario concret. La requête /v1/search?q=running+shoes de la boutique Acme Shop est servie par un edge régional, puis par une passerelle de recherche qui authentifie l'acheteur, appelle en parallèle les services de recherche et de catalogue, puis obtient la disponibilité en direct avant de renvoyer des résultats. L'objectif côté client est p95 ≤ 600 ms ; l'inventaire peut être indisponible, à condition que la réponse indique honnêtement une disponibilité temporairement inconnue plutôt que d'inventer une valeur de stock.

Sur ce chemin, l'edge et la passerelle sont séquentiels : environ 70 ms de transit et de politique edge, puis 35 ms d'authentification et de fan-out. La recherche et le catalogue s'exécutent ensuite en parallèle — respectivement 90 ms et 115 ms p95 — si bien que la branche la plus lente, le catalogue, consomme seule le temps écoulé de cette étape. La disponibilité en direct reste ensuite sur le chemin critique avec 140 ms, avant 80 ms de sérialisation et de transit retour.

Valider ce chemin exige un histogramme de latence au niveau de la route, une propagation de trace conforme au standard W3C à l'edge et dans les services, un environnement de préproduction sûr, et des responsables identifiés pour la recherche, le catalogue et l'inventaire. L'objectif : tenir ce parcours dans son budget p95 de 600 ms, savoir quel saut a consommé ce budget en cas de dérive, et appliquer une atténuation ciblée sans jamais masquer une défaillance de dépendance.

Commencez par le parcours utilisateur

Définissez la transaction avant de la mesurer. « Latence de l'API » est trop vaste ; « un client connecté reçoit les résultats de recherche de produits » identifie un chemin qui peut être instrumenté et protégé. Consignez le lieu d'origine, la catégorie de réseau, la méthode de requête, la taille de charge utile, l'état d'authentification, la possibilité de mise en cache, les appels en aval et la réponse qui achève le parcours.

Utilisez des objectifs distincts pour des tâches matériellement différentes. Une page de catalogue mise en cache, une requête de recherche authentifiée et une autorisation de paiement ont des exigences de correction différentes et ne peuvent pas partager une même cible de latence de façon sûre. Incluez les conditions de disponibilité et de correction avec le temps : un prix obsolète obtenu rapidement ou une réponse de paiement partielle obtenue rapidement ne constituent pas une transaction réussie.

Exemple de budget pour un chemin de lecture

Pour une cible p95 de 600 ms entre un client régional et une réponse API rendue, une équipe pourrait allouer :

ÉtapeBudgetQuestion architecturale
Client, DNS, TLS et transit réseau180 msLa réutilisation de connexion, HTTP/2 ou HTTP/3 et un placement edge régional peuvent-ils réduire le temps de préparation évitable ?
Politique edge et consultation du cache35 msLa requête peut-elle être mise en cache, regroupée ou rejetée avant l'origine sans risque ?
Passerelle d'origine et travail du service160 msQuels appels sont sur le chemin critique et lesquels peuvent s'exécuter de manière asynchrone ?
Base de données et dépendances distantes120 msLes délais d'expiration sont-ils bornés, les pools dimensionnés et les requêtes indexées pour la concurrence attendue ?
Sérialisation, transit de la réponse et marge105 msLa taille de la réponse correspond-elle à la réalité du réseau et reste-t-il une marge pour la variation normale ?

Ce sont des allocations de planification, et non des mesures à additionner aveuglément. Le travail parallèle consomme le temps écoulé de sa branche la plus lente, tandis que les appels séquentiels s'additionnent. Rendez cette distinction explicite dans un diagramme de dépendances ; sinon, un budget peut faire paraître anodin un fan-out séquentiel.

Calculez le chemin critique avant de fixer les délais d'expiration

Reprenons le scénario Acme Shop avec les valeurs p95 mesurées : 70 ms de transit edge, 35 ms de passerelle, 90 ms de recherche, 115 ms de catalogue, 140 ms d'inventaire et 80 ms de sérialisation et transit de la réponse. La recherche et le catalogue démarrent ensemble juste après la passerelle, si bien que le chemin critique se calcule ainsi : 70 + 35 + le maximum de 90 et 115 (soit 115) + 140 + 80, ce qui donne 440 ms. Sur un budget p95 de 600 ms, il reste donc une marge de 160 ms, qui couvre la variance ordinaire, l'acquisition de connexion et une décision de repli bornée — ce n'est pas une autorisation pour que chaque dépendance ajoute une nouvelle tentative.

Dans la politique de la passerelle Acme Shop, chaque dépendance reçoit un délai d'expiration de départ, à valider sous charge réelle : 150 ms pour la recherche, 150 ms pour le catalogue et 175 ms pour l'inventaire, avec un repli explicite qui renvoie les résultats en marquant la disponibilité comme temporairement indisponible si le délai d'inventaire expire.

Déduisez les budgets du chemin critique

Dessinez le chemin de requête depuis le client, via DNS, CDN ou edge, passerelle, services, magasins de données et tiers. Marquez chaque arête comme séquentielle, parallèle, facultative, mise en cache ou asynchrone. Attribuez ensuite une échéance à la requête et des échéances plus courtes aux travaux qui doivent se terminer avant celle-ci.

Une hiérarchie efficace de délais d'expiration laisse du temps à l'appelant pour réagir. Si la passerelle dispose de 700 ms, un service ne devrait pas lancer un appel de base de données de 700 ms après avoir passé 300 ms sur une requête en amont. Propagez une échéance, et pas seulement des délais d'expiration fixes indépendants. Les services doivent refuser un travail qui ne peut plus se terminer utilement, libérer les ressources et signaler une raison d'expiration qui rende visible l'étape ayant épuisé le budget.

Les nouvelles tentatives nécessitent leur propre budget. Une nouvelle tentative ne peut améliorer une défaillance transitoire que s'il reste assez de temps, que l'opération peut être répétée sans risque et qu'elle n'amplifiera pas une dépendance déjà sous charge. Utilisez un nombre de tentatives borné, un backoff avec gigue, des limites de tentatives par requête et des clés d'idempotence pour les opérations ayant des effets métier. Ne répétez pas automatiquement une requête expirée lorsque l'opération d'origine peut encore se terminer.

Propagez une échéance plutôt que d'empiler des délais fixes

La politique Acme Shop ci-dessus attribue à chaque dépendance un délai d'expiration indépendant. C'est un point de départ raisonnable, mais il comporte une lacune : un délai fixe de 175 ms pour l'inventaire ne sait pas si la passerelle dispose encore de 400 ms ou de 40 ms au moment où elle lance l'appel. La propagation d'échéance comble cette lacune en faisant transiter une échéance absolue unique, fixée une seule fois à l'edge ou à la passerelle, à travers chaque saut ; chaque service calcule alors son propre budget résiduel en soustrayant le temps déjà écoulé, plutôt que de se fier à une constante locale. gRPC fait cela nativement via l'en-tête grpc-timeout recalculé à chaque saut ; une chaîne d'appels HTTP obtient le même effet en propageant un horodatage d'échéance lu par chaque service. Le livre SRE de Google cite la propagation d'échéance comme défense contre les défaillances en cascade : un appelant qui a déjà consommé la majeure partie de son budget ne devrait jamais lancer un appel de dépendance avec un délai plus long que le temps qu'il lui reste réellement.

Pour Acme Shop, cela changerait l'appel d'inventaire de « attendre systématiquement jusqu'à 175 ms » à « attendre jusqu'au minimum de 175 ms et de l'échéance résiduelle », ce que confirme la trace d'acquisition de pool présentée plus loin. La distinction compte en cas de lenteur partielle : des délais fixes indépendants peuvent laisser trois dépendances séquentielles consommer chacune près de leur allocation totale et dépasser l'échéance du parcours, sans qu'aucune n'ait individuellement expiré.

Envisagez les requêtes dupliquées (hedging) pour les branches sensibles à la queue de distribution

Les délais d'expiration et les nouvelles tentatives répondent à « que faire quand un appel est trop lent ». Le hedging — l'envoi de requêtes dupliquées — pose une question différente : peut-on éviter d'attendre la queue de distribution la plus lente ? Une requête dupliquée envoie une seconde copie d'un appel idempotent et en lecture vers une autre instance après un court délai, conserve la première réponse arrivée et annule l'autre. L'article « The Tail at Scale » de Google a popularisé cette technique : une petite fraction des requêtes adressées à une réplique donnée est disproportionnément plus lente que les autres, et sonder une seconde réplique après environ le p90 attendu capture la majeure partie de cette traîne, tout en laissant la plupart des requêtes principales se terminer avant même que la requête dupliquée ne se déclenche.

Le hedging se prête facilement à un mauvais usage : le déclencher sur chaque requête double la charge du backend, et le déclencher après un délai fixe la double précisément quand un incident de capacité rend chaque requête assez lente pour franchir ce délai. La politique de hedging de gRPC s'en protège avec une limitation en seau à jetons : les requêtes dupliquées ne se déclenchent que tant qu'un budget alimenté par le volume normal reste disponible. Pour Acme Shop, la recherche (90 ms p95) est un candidat plausible au hedging car elle est en lecture et idempotente ; l'inventaire ne l'est pas, car la disponibilité en direct ne doit pas dépendre de deux lectures concurrentes contre un système qui traite aussi des écritures.

Considérez la mise en file d'attente comme un signal de latence

Lorsque l'utilisation approche la capacité, le temps d'attente augmente souvent plus vite que le débit de requêtes. Le CPU peut sembler acceptable tandis qu'un pool de connexions fini, une partition de base de données unique, un pool de threads ou une limite de concurrence en amont crée une file d'attente. Mesurez la profondeur de file, la durée d'attente, la concurrence active, la saturation et le taux de rejet avec la latence des requêtes.

Gardez volontairement le travail synchrone réduit. Déplacez vers une file durable le travail non essentiel, comme les notifications, le traitement d'images, l'enrichissement analytique et certains rapprochements, lorsque le flux métier le permet. Une file protège l'appelant d'un worker lent, mais n'efface pas la latence : l'âge de la file fait partie de l'objectif de réalisation. Définissez des cibles distinctes pour le délai d'acceptation et le délai de réalisation de bout en bout.

Appliquez un contrôle d'admission avant qu'une dépendance soit saturée. Une file bornée, une limite de concurrence, une réponse de délestage ou une réponse dégradée peuvent préserver un travail utile pour davantage d'utilisateurs qu'une attente illimitée. Les recommandations Google SRE sur la surcharge soulignent cette distinction : accepter un travail qui ne peut pas être achevé consomme des ressources et peut ralentir la récupération.

Dimensionnez les pools avec la loi de Little, plutôt qu'à l'intuition

La loi de Little énonce que le nombre moyen de requêtes en cours dans un système est égal au taux d'arrivée multiplié par le temps moyen que chaque requête y passe : L = λ × W. Elle ne tient que dans une file stable, où le taux d'arrivée reste inférieur à la capacité de service ; près de cette limite, le temps d'attente cesse de croître linéairement et grimpe brutalement, ce qui explique pourquoi un taux d'utilisation supérieur à environ 70-80 % sur une ressource finie est le point où p95 et p99 se détachent de p50. Le pool d'inventaire d'Acme Shop, limité à 40 connexions actives, illustre cette question : à un temps de service moyen de 140 ms par appel, 40 connexions soutiennent environ 40 / 0,140 s ≈ 285 requêtes par seconde avant que la file ne commence réellement à se former. À 220 requêtes par seconde, ce pool a encore de la marge ; à 300, sous l'effet d'une promotion commerciale, il dépasse son point stable, et le délai de 175 ms alloué à l'inventaire commence à être consommé par l'attente en file plutôt que par l'appel lui-même. Dimensionnez un pool ou une limite de concurrence comme une décision de capacité liée au budget et au taux d'arrivée mesuré, non comme une valeur par défaut héritée d'un modèle, et recalculez-la lorsque le trafic ou la latence par appel change significativement.

Application des budgets de latence des systèmes distribués : coupe-circuits et cloisonnements (bulkheads)

Un budget et une hiérarchie de délais d'expiration décrivent le comportement visé, mais l'application du budget de latence ne tient sous un trafic réel que si un mécanisme empêche concrètement une dépendance lente ou défaillante de consommer plus que sa part allouée, généralement via deux mécanismes complémentaires.

Un cloisonnement (bulkhead) isole le rayon d'impact d'une dépendance en lui attribuant sa propre ressource bornée — pool de connexions, pool de threads ou sémaphore — afin qu'une dépendance d'inventaire lente ne puisse pas priver de ressources un catalogue par ailleurs en bonne santé. Un coupe-circuit (circuit breaker) arrête d'envoyer des appels à une dépendance dès qu'elle est jugée défaillante, pour que les appelants échouent rapidement plutôt que de s'accumuler derrière un état déjà mauvais. Les implémentations ne sont pas interchangeables : un coupe-circuit proxy comme celui d'Envoy applique des plafonds stricts de concurrence par cluster, sans machine à états fondée sur un taux d'erreur, alors qu'un coupe-circuit bibliothèque comme resilience4j suit un taux d'erreur glissant et bascule entre ouvert, semi-ouvert et fermé. Un mécanisme voisin, la détection d'anomalies (outlier detection), éjecte temporairement de la répartition de charge un hôte individuel malade sans toucher au reste du cluster ; la combiner à un coupe-circuit de cluster applique le budget à deux granularités.

Pour Acme Shop, un cloisonnement autour du pool d'inventaire est précisément ce que montre déjà la trace de diagnostic plus loin : le plafond limit=40 du pool est un plafond de cloisonnement, et son échéance dépassée à ce plafond relève d'un contrôle d'admission qui fonctionne comme prévu, pas d'un bug. Un coupe-circuit devant cette dépendance permettrait à la passerelle de cesser complètement les appels d'inventaire pendant une courte fenêtre après une série d'échecs, en servant immédiatement le repli plutôt que de payer, à chaque requête, l'attente d'acquisition du pool.

Une application cohérente chez chaque fournisseur du chemin

Un budget de latence ne vaut que ce que vaut son application, et cette application vit à plusieurs endroits à la fois : politique edge, délais d'expiration de la passerelle, coupe-circuits au niveau des services, contrôle d'admission à l'origine — souvent chez des fournisseurs différents. L'orchestration edge managée d'Optimi garde cette application lisible en un seul endroit, en reliant chaque dépassement de budget au saut et au fournisseur précis qui a consommé ce temps, afin que MYO donne à une seule équipe, et non à cinq tableaux de bord, la preuve sur laquelle agir.

Utilisez le cache et les contrôles edge sans compromettre la correction

La périphérie est souvent l'endroit où répondre à une requête ou la rejeter coûte le moins de latence, mais la configuration du cache fait partie de la correction applicative. Mettez en cache les réponses publiques dont la représentation est stable avec une politique Cache-Control explicite. Ne mettez pas en cache des réponses authentifiées ou personnalisées dans un cache partagé, à moins que la clé de cache et le modèle d'autorisation ne rendent l'isolation démontrable.

Pour le contenu pouvant être mis en cache, définissez la clé de cache, la durée de fraîcheur, le comportement de validation, le chemin d'invalidation et la politique de service de contenu obsolète. Les extensions stale-while-revalidate et stale-if-error de Cache-Control, normalisées dans la RFC 5861 en complément de la RFC 9111, permettent à un cache de servir immédiatement une copie obsolète tout en la revalidant en arrière-plan, ou de se replier sur elle lorsque l'origine renvoie une erreur. stale-while-revalidate peut réduire la latence d'origine pour les lectures tolérantes ; stale-if-error peut préserver une réponse valide lors d'une défaillance de l'origine. Aucun des deux ne convient à un inventaire évoluant rapidement, à des décisions d'autorisation ou à un état financier sans décision produit explicite.

Protégez la capacité de l'origine lors des échecs de cache. Activez le regroupement de requêtes ou un comportement single-flight lorsqu'il est disponible afin que de nombreux échecs simultanés pour le même objet ne deviennent pas un troupeau d'éléphants. Utilisez un origin shield ou un niveau régional contrôlé pour consolider le trafic des échecs de cache. Définissez les limites de connexions, de débit de requêtes et de concurrence de l'origine indépendamment de la capacité edge publique, et exigez un accès edge-à-origine authentifié afin que les clients ne puissent pas contourner ces contrôles.

Instrumentez le budget au-delà des frontières

Un identifiant de requête unique est utile ; les traces distribuées le sont davantage lorsqu'elles préservent les relations parent-enfant, le timing, le statut, les nouvelles tentatives et l'état du cache. Adoptez les conventions sémantiques OpenTelemetry lorsque cela est pratique pour HTTP, RPC, les bases de données, la messagerie et les ressources cloud. Propagez le contexte de trace standard à travers les passerelles, services, workers et messages asynchrones.

Les groupes de conventions sémantiques ne se stabilisent pas au même rythme — OpenTelemetry publie un statut de stabilité propre à chaque domaine, et les conventions bases de données ou messagerie ont parfois atteint la stabilité avant celles pour HTTP. Fixez la version des conventions que vous émettez plutôt que de suivre automatiquement la « dernière », afin qu'un changement de convention ne réécrive pas silencieusement les requêtes de vos tableaux de bord.

Au minimum, ajoutez ces dimensions à la télémétrie de latence :

  • Nom de route et d'opération, et non des URL brutes non bornées ou des identifiants utilisateur.
  • Région, emplacement edge lorsqu'il est disponible, catégorie de réseau client et version de déploiement.
  • État du cache, état de l'origin shield, taille de réponse et version de protocole.
  • Nom de la dépendance, numéro de tentative, source du délai d'expiration, état du circuit et temps d'attente en file.
  • Classe de résultat : succès, rejet attendu, échéance dépassée, annulation ou défaillance de dépendance.

Utilisez les métriques pour les alertes et la détection de tendances, les traces pour le diagnostic du chemin critique et les journaux échantillonnés comme éléments de preuve. Contrôlez la cardinalité et masquez les secrets, jetons, charges utiles et données personnelles. Une conception d'observabilité qui surcharge le stockage ou divulgue le contenu des requêtes n'améliore pas la fiabilité.

Diagnostiquez une dérive de budget à partir d'une trace

Commencez par les traces qui ont dépassé le seuil du parcours, puis comparez la cohorte lente à une cohorte non affectée sur la même route, région, version de déploiement et état de cache. Ne concluez pas que la portée (span) la plus longue est la cause avant que son temps d'attente en file, ses tentatives et les portées en aval ne confirment cette hypothèse.

Une trace représentative du parcours de recherche Acme Shop illustre ce raisonnement. Sur la route GET /v1/search, région fra, avec un échec de cache, le temps total est de 397 ms pour une échéance de 600 ms et un résultat 200 : réception edge 68 ms, autorisation passerelle 34 ms, recherche 87 ms, catalogue 111 ms. Le client d'inventaire affiche 175 ms avec un statut d'échéance dépassée, son délai enfant ayant démarré alors qu'il restait 387 ms sur le budget parent ; en descendant dans cette portée, l'acquisition du pool d'inventaire montre elle-même 175 ms d'échéance dépassée avec 40 connexions actives sur une limite de 40, et l'appel HTTP d'inventaire n'a jamais démarré. La passerelle répond en 9 ms avec un statut 200 et une disponibilité marquée temporairement indisponible.

Le diagnostic est donc celui d'une file de ressources, pas d'une réponse d'inventaire lente : le repli documenté est renvoyé bien à l'intérieur des 600 ms du parcours, laissant même 203 ms inutilisés. Avant de modifier un délai d'expiration, confirmez la limite du pool, le nombre d'appels actifs, la saturation de la base de données et un déploiement récent ; une réduction ciblée de la concurrence sur les rafraîchissements non essentiels, ou un repli de disponibilité honnête, peuvent protéger le passage en caisse pendant que le responsable de l'inventaire restaure sa capacité.

Validez, récupérez et diagnostiquez les incidents

Validez vos changements dans un environnement hors production, ou lors d'un canari de production étroitement borné, réversible et soumis à approbation. Établissez d'abord une base saine ; injectez ensuite un délai borné sur l'inventaire et vérifiez que la passerelle renvoie bien le repli documenté avant 600 ms, puis retirez le délai et vérifiez que le p95, l'attente de pool, le taux d'erreur et l'échantillonnage des traces reviennent à leur niveau de référence. Un repli déclenché sur une route qui exige un inventaire en direct est un défaut de contrat, pas un test réussi ; une attente de pool ou un âge de file qui continue de croître après la fin du test doit arrêter l'expérimentation.

Si un changement publié de délai d'expiration, de cache ou de concurrence augmente l'impact utilisateur, revenez uniquement sur cette politique ou ce déploiement versionné, via le processus de changement normal, en conservant traces, horodatages et cohorte affectée pour le diagnostic. Rétablissez la dernière politique connue comme sûre, ne videz que le travail sûr à annuler, et vérifiez la latence et la saturation sur une fenêtre d'observation définie. N'augmentez pas globalement les délais d'expiration, ne videz pas tous les caches et ne rejouez pas de trafic vers une dépendance déjà sous contrainte.

Quelques schémas récurrents orientent le diagnostic :

  • p95 en hausse seulement sur les échecs de cache (taux de succès en baisse, portées d'origine plus longues) : vérifiez les changements de clé ou d'invalidation et restaurez la dernière règle sûre si besoin.
  • Longue portée d'acquisition de pool, temps HTTP normal : réduisez la concurrence des appelants non essentiels et examinez le pool ou la base de données contraints.
  • Une même branche parallèle domine les traces lentes : appliquez son repli ou son cloisonnement plutôt que de sérialiser le fan-out.
  • Erreurs d'échéance après un déploiement : isolez la régression par version, arrêtez le déploiement et revenez en arrière via le chemin approuvé.
  • Échecs rapides et uniformes remplaçant des traces lentes : le coupe-circuit est probablement ouvert ; confirmez que la dépendance est réellement défaillante avant de le forcer à se refermer sous charge.
  • Un même hôte reste systématiquement la traîne lente : la détection d'anomalies l'éjecte puis le réadmet en boucle ; examinez cet hôte pour une fuite de ressource ou un mauvais déploiement avant de suspecter le reste du parc.

Rendez explicites les compromis de fiabilité

Une latence plus faible et une cohérence plus forte peuvent entrer en conflit lorsque les données couvrent plusieurs régions. Un modèle de lecture répliqué mondialement peut améliorer les lectures proches tout en renvoyant des données légèrement plus anciennes. Une écriture synchrone interrégionale peut renforcer les garanties de durabilité tout en ajoutant un délai réseau et en couplant la disponibilité à davantage d'emplacements. Décidez par opération si la priorité est la fraîcheur, la cohérence, la faible latence ou la réalisation en cas de partition, et documentez le comportement de repli.

De même, une distribution multi-fournisseurs peut réduire la dépendance à un réseau, mais elle ajoute de la complexité de cache, routage, certificats, journalisation et gestion d'incident. Ne routez que lorsque les signaux de santé sont pertinents, incluez une hystérésis pour empêcher les basculements répétés et répétez une défaillance partielle de fournisseur. Une architecture neutre vis-à-vis des fournisseurs signifie définir le comportement requis, la télémétrie, les interfaces et le chemin de sortie avant de choisir une implémentation spécifique.

Exploitez le budget

Révisez un budget de latence lorsqu'un parcours utilisateur, une dépendance, la forme du trafic ou la topologie de déploiement change. Pour chaque objectif, maintenez un tableau de bord montrant p50, p95, p99, le taux d'erreur, la saturation, le taux de hit du cache et les plus grands contributeurs à la durée des traces. Comparez les sondes synthétiques à la télémétrie d'utilisateurs réels ; une sonde saine depuis une région cloud ne représente pas tous les réseaux clients.

Lors d'un incident, déterminez d'abord si la régression se situe au niveau client/réseau, edge, origine, service, magasin de données ou tiers. Évitez d'augmenter les délais d'expiration comme première réponse. Des attentes plus longues peuvent augmenter la concurrence et aggraver une file. Préférez une atténuation ciblée : servir une représentation mise en cache sûre, délester une fonctionnalité non critique, réduire le fan-out, suspendre une charge batch ou déplacer le trafic après avoir validé la capacité et le comportement des données.

Conception de budget de performance : liste de contrôle finale

La conception de budget de performance est la somme de chaque décision présentée dans ce guide ; traitez-la comme une porte d'approbation unique, et non comme des validations indépendantes. Avant d'approuver un chemin critique, confirmez qu'il dispose d'un objectif p95 ou p99 orienté utilisateur ; que les dépendances séquentielles et parallèles sont cartographiées, avec la branche parallèle la plus lente clairement identifiée ; que les échéances sont propagées plutôt que fixées indépendamment à chaque saut ; que les nouvelles tentatives sont bornées et idempotentes lorsque nécessaire, et que tout hedging est limité en débit ; que le comportement du cache est sûr pour les données ; que les pools et limites de concurrence sont dimensionnés d'après le taux d'arrivée et le temps de service mesurés, et non estimés au hasard ; que des cloisonnements et des coupe-circuits isolent les dépendances les plus susceptibles de se dégrader ; que l'origine dispose d'une capacité protégée ; que l'âge de la file est surveillé séparément du délai d'acceptation ; et que les traces permettent de nommer le saut ayant consommé le budget.

Références faisant autorité

Transformez vos budgets de latence en architecture orchestrée et observable

Travaillez avec Optimi pour concevoir des budgets de latence des systèmes distribués, les appliquer chez chaque fournisseur edge et origine du chemin, et en suivre le résultat dans MYO à travers les axes Performance, Sécurité et Visibilité.

Discuter de l'architecture de performance