Partager via


Principes de conception fiabilité

Les pannes et les dysfonctionnements sont des préoccupations graves pour toutes les charges de travail. Une charge de travail fiable doit survivre à ces événements et continuer à fournir constamment ses fonctionnalités prévues. Elle doit être résiliente afin qu’elle puisse détecter et résister aux pannes tout en continuant à fonctionner. Il doit être récupérable afin que, si une interruption dépasse les mesures de résilience, la charge de travail peut être restaurée dans les objectifs de récupération convenus. Il doit également être disponible pour permettre aux utilisateurs d’accéder à la charge de travail pendant la période promise au niveau de qualité promis.

Il n’est pas réaliste de supposer que les défaillances ne se produisent pas, en particulier lorsque la charge de travail est générée pour s’exécuter sur des systèmes distribués. Certains composants peuvent échouer alors que d’autres continuent à fonctionner. À un moment donné, l’expérience utilisateur peut être affectée, ce qui compromet les objectifs métier.

Les architectures de charge de travail doivent avoir des garanties de fiabilité dans le code d’application, l’infrastructure et les opérations. Les choix de conception ne doivent pas modifier l’intention spécifiée par les exigences métier. Ces changements devraient être considérés comme des compromis importants.

Les principes de conception sont destinés à fournir des conseils sur les aspects de la fiabilité que vous devez prendre en compte tout au long du cycle de vie du développement. Commencez par les approches recommandées et justifiez les avantages d’un ensemble d’exigences. Après avoir défini votre stratégie, effectuez des actions à l’aide de la liste de contrôle de fiabilité.

Si vous n’appliquez pas ces principes à votre conception, la charge de travail ne sera probablement pas prête à anticiper ou à gérer les problèmes en production. Le résultat pourrait être des interruptions de service pouvant entraîner des pertes financières. Dans le cas des charges de travail critiques, l’échec de l’application de ces principes pourrait compromettre la sécurité.

Conception pour les besoins de l’entreprise

Icône Objectif Obtenez plus de clarté sur l’étendue de la charge de travail, la croissance des utilisateurs et, plus important encore, sur les promesses que l’équipe a faites aux clients externes et aux parties prenantes internes.

La conception n'est pas un travail de devinette basé sur des résultats non définis ou vagues. La fiabilité nécessite une activité délibérée qui atteint l’alignement sur l’expérience utilisateur acceptable, les contraintes de conception et sur la réussite à laquelle elle ressemble et comment elle est mesurée.

Définissez des objectifs clairs, réalisables et documentés, négociés avec les parties prenantes de l’entreprise et ancrés dans un investissement et une prévision réalistes. Ces exigences informent directement vos choix architecturaux, des stratégies de résilience aux outils d’observabilité et aux plans de mise à l’échelle.

Approche Avantage
Concentrez-vous sur la collecte d’informations nécessaires pour définir l’étendue et la profondeur de la solution. Clarifier les contraintes qui influencent les objectifs métier. Commencez par des questions générales, telles que :

- Quel niveau de résilience, de récupération, d’observabilité et de simplicité est requis ?
- Existe-t-il des contraintes définies liées au coût, à la conformité, à la géographie ou à la latence ?

En fonction de ces informations, documentez ce qui est assez bon et simple à réaliser.
Comprendre les objectifs et les limites empêchera les estimations. Sinon, vous risquez d’être bloqué dans une boucle de conception itérative, ce qui entraîne des efforts gaspiller et des coûts inutiles.
Guidez la prise de décision en traduisant les objectifs métier en compréhension partagée des compromis architecturaux dans les contraintes réelles. Présentez les options qui ont un impact :

- Coût financier
- Complexité de l’ingénierie
- Considérations relatives à la sécurité
- Surcharge opérationnelle
Cela aidera les parties prenantes à comprendre les coûts, la complexité et les implications opérationnelles de leurs demandes et à les guider vers des résultats réalistes et alignés.
Hiérarchiser la définition des résultats de fiabilité pour chaque flux utilisateur critique sur des mesures génériques, telles que le temps d’activité.

Identifiez les fonctionnalités et les flux utilisateur via le système, et pour chacun d’eux, évaluez sa valeur métier, ses modèles d’utilisation et ses exigences de résilience. Favoriser le consensus au niveau du flux pour garantir que les décisions de conception restent alignées sur les objectifs métier.
Cette conversation permet aux parties prenantes de s’éloigner des déclarations intenables, comme « le site doit toujours être opérationnel » aux attentes pratiques et réalisables liées aux fonctionnalités réelles et aux résultats. Ces résultats permettent d’établir ce qui est résolu avec la technologie et ce qui peut être traité avec des plans de continuité d’activité supplémentaires.
Choix de conception d’ancre autour des horizons temporels.

Définissez les attentes d’utilisation avec des prévisions réalistes. Par exemple, quelle est la charge de l’utilisateur attendue au lancement ? Est-il prévu que la croissance des utilisateurs soit linéaire, exponentielle ou incertaine ?
Ces informations vous aideront à concevoir une architecture qui traitera les besoins de fiabilité à court terme tout en évitant les décisions de conception nécessitant une remaniement importante pour gérer les horizons futurs. Cette approche a un impact sur la façon de réfléchir à l’élasticité, aux flux de travail pilotés par les événements et vous permet de faire des choix stratégiques sur la dette technique à engager ou à éviter.
Facteur des dépendances qui peuvent limiter l’autonomie de la conception, comme les contraintes organisationnelles.

Tenez compte de l’infrastructure centralisée, des mandats de sécurité, des stratégies de routage réseau ou des décisions de plateforme qui affectent directement ce que vous pouvez promettre en termes de résilience, de disponibilité et de récupération.
Comprendre votre dépendance vis-à-vis des services en dehors de votre contrôle vous aide à concevoir des attentes réalistes en matière de fiabilité. Il garantit que vos cibles RTO/RPO et les SLO sont réalisables et clairement communiquées, en évitant les surpromises et en réduisant les surprises.

Conception favorisant la résilience

Icône Objectif La charge de travail doit continuer à fonctionner avec des fonctionnalités complètes ou réduites.

Vous devez vous attendre à ce que les défaillances des composants, les pannes de plateforme, les dégradations des performances, la disponibilité limitée des ressources et d’autres erreurs se produisent. Générez la résilience dans le système afin qu’elle soit tolérante aux pannes et qu’elle puisse dégrader correctement.

Approche Avantage
Distinguez les composants qui se trouvent sur le chemin critique de ceux qui peuvent fonctionner dans un état détérioré. Tous les composants de la charge de travail ne doivent pas nécessairement être tout aussi fiables. La détermination de la criticité vous aide à concevoir en fonction de la criticité de chaque composant. Vous ne sur-concevrez pas la résilience des composants qui pourraient légèrement détériorer l’expérience utilisateur, à l'inverse des composants qui peuvent entraîner des problèmes de bout en bout s'ils échouent.

La conception peut être efficace pour allouer des ressources à des composants critiques. Vous pouvez également implémenter des stratégies d’isolation des erreurs afin que si un composant non critique échoue ou entre dans un état détérioré, il peut être isolé pour empêcher les défaillances en cascade.
Identifiez les points d’échec potentiels dans le système, en particulier pour les composants critiques, et déterminez l’effet sur les flux utilisateur. Vous pouvez analyser les cas d’échec, le rayon d’explosion et l’intensité de la panne : panne complète ou partielle. Cette analyse influence la conception des fonctionnalités de gestion des erreurs au niveau du composant.
Développez des capacités d'auto-préservation en utilisant correctement les modèles de conception et en modularisant le design pour isoler les défaillances. Le système sera en mesure d’empêcher un problème d’affecter les composants en aval. Le système pourra atténuer les défaillances temporaires et permanentes, les goulots d’étranglement des performances et d’autres problèmes susceptibles d’affecter la fiabilité.

Vous serez également en mesure de réduire le rayon d’explosion.
Ajoutez la possibilité d’effectuer un scale-out des composants critiques (application et infrastructure) en tenant compte des contraintes de capacité des services dans les régions prises en charge. La charge de travail sera en mesure de gérer les pics de capacité variables et les fluctuations. Cette fonctionnalité est cruciale lorsqu’il existe une charge inattendue sur le système, comme une augmentation de l’utilisation valide. Si la charge de travail est conçue pour effectuer un scale-out sur plusieurs régions, elle peut même surmonter les contraintes potentielles de capacité des ressources temporaires ou d’autres problèmes ayant un impact sur une seule région.
Générez la redondance dans les couches et la résilience sur différents niveaux d’application.

Visez la redondance dans les utilitaires physiques et la réplication immédiate des données. Visez également la redondance dans la couche fonctionnelle qui couvre les services, les opérations et le personnel.
La redondance permet de réduire les points de défaillance uniques. Par exemple, s'il y a une panne de composant, zonale ou régionale, un déploiement redondant (en mode actif-actif ou actif-passif) vous permet de répondre aux objectifs de disponibilité.

L’ajout d’intermédiaires empêche la dépendance directe entre les composants et améliore la mise en mémoire tampon. Ces deux avantages renforcent la résilience du système.
Surprovisionner pour atténuer immédiatement les défaillances individuelles des instances redondantes et pour prévenir une consommation excessive de ressources. Un investissement plus élevé dans le surprovisionnement augmente la résilience.

Le système continuera à fonctionner à l’utilitaire complet pendant une défaillance active, même avant que les opérations de mise à l’échelle puissent commencer à corriger l’échec. De même, vous pouvez réduire le risque d'une consommation incontrôlée et inattendue de ressources qui entame votre mémoire tampon planifiée, vous permettant de gagner du temps précieux pour le triage, avant que des pannes du système ou une mise à l'échelle agressive ne se produisent.

Conception favorisant la récupération

Icône Objectif La charge de travail doit être en mesure d’anticiper et de récupérer à partir de la plupart des défaillances, de toutes les grandeurs, avec une interruption minimale de l’expérience utilisateur et des objectifs métier.

Même les systèmes hautement résilients ont besoin d’approches de préparation aux catastrophes, à la fois dans la conception de l’architecture et les opérations de charge de travail. Sur la couche de données, vous devez avoir des stratégies qui peuvent restaurer l'état de la charge de travail en cas de corruption.

Approche Avantage
Avoir des plans de récupération structurés, testés et documentés alignés sur les objectifs de récupération négociés. Les plans doivent couvrir tous les composants en plus du système dans son ensemble. Un processus bien défini conduit à une récupération rapide qui peut empêcher un impact négatif sur les finances et la réputation de votre entreprise. Effectuer des exercices de récupération réguliers met à l'épreuve le processus de récupération des composants système, des données et des étapes de basculement et de restauration afin d’éviter toute confusion lorsque la rapidité et l'intégrité des données sont des mesures clés du succès.
Vérifiez que vous pouvez réparer les données de tous les composants d'état au sein de vos objectifs de récupération. Les sauvegardes sont essentielles pour ramener le système à un état de fonctionnement à l’aide d’un point de récupération approuvé, comme le dernier état correct connu.

Les sauvegardes immuables et cohérentes sur le plan transactionnel garantissent que les données ne peuvent pas être modifiées et que les données restaurées ne sont pas endommagées.
Implémentez des fonctionnalités d’auto-réparation automatisées dans la conception. Cette automatisation réduit les risques liés à des facteurs externes, comme l’intervention humaine, et raccourcit le cycle de réparation des ruptures.
Remplacez les composants sans état par des unités éphémères immuables. La création d’unités éphémères que vous pouvez faire tourner et détruire à la demande offre une répétabilité et une cohérence. Utilisez des modèles de déploiement côte à côte pour effectuer la transition vers les nouvelles unités incrémentielles, réduisant ainsi les interruptions.

Conception pour les opérations

Icône Objectif Déplacez vers la gauche dans les opérations pour anticiper les conditions d’échec.

Testez les échecs tôt et souvent dans le cycle de vie du développement, et évaluez l’impact des performances sur la fiabilité. Pour les analyses de la cause racine et les analyses rétrospectives, vous devez avoir une visibilité partagée entre les équipes de l’état des dépendances et les défaillances en cours. Les insights, les diagnostics et les alertes des systèmes observables sont fondamentaux pour une gestion efficace des incidents et une amélioration continue.

Approche Avantage
Créez des systèmes observables qui peuvent mettre en corrélation les données de télémétrie. La supervision et les diagnostics sont des opérations cruciales. En cas d’échec, vous devez savoir qu’il a échoué, quand il a échoué et pourquoi il a échoué. L’observabilité au niveau du composant est fondamentale, mais l’observabilité agrégée des composants et des flux utilisateur corrélés fournit une vue holistique de l’état d’intégrité. Ces données sont nécessaires pour permettre aux ingénieurs de fiabilité du site de définir la priorité de leurs travaux de correction.
Prédire les dysfonctionnements potentiels et le comportement anormal. Rendez visibles les défaillances de fiabilité actives en utilisant des hiérarchisées et actionnables.

Investissez dans des processus et une infrastructure fiables qui permettent un triage plus rapide.
Les ingénieurs de fiabilité de site peuvent être avertis immédiatement afin qu’ils puissent atténuer les incidents de site en direct en cours et atténuer de manière proactive les défaillances potentielles identifiées par des alertes prédictives avant qu’elles ne deviennent des incidents en direct.
Simuler des défaillances et exécuter des tests dans des environnements de production et de préproduction. Il est utile d’expérimenter des défaillances en production pour que vous puissiez définir des attentes réalistes en matière de récupération. Ceci vous permet de faire des choix de conception qui répondent de façon adaptée aux défaillances. Cela vous permet aussi de tester les seuils que vous définissez pour les métriques métier.
Créez des composants avec l’automatisation à l’esprit et automatisez autant que possible. L’automatisation réduit le risque d’erreur humaine, en apportant une cohérence aux tests, au déploiement et aux opérations.
Prenez en compte les opérations courantes et leur impact sur la stabilité du système. La charge de travail peut être soumise à des opérations en cours, telles que les révisions d’application, les audits de sécurité et de conformité, les mises à niveau des composants et les processus de sauvegarde. L’examen de ces changements garantit la stabilité du système.
Continuez à apprendre en continu à partir des incidents en production. En fonction des incidents, vous pouvez déterminer l’impact et les surveillances dans la conception et les opérations qui peuvent passer inaperçues dans la préproduction. En fin de compte, vous serez en mesure de générer des améliorations basées sur des incidents réels.

Restez simple

Icône d’objectif Évitez l’ingénierie excessive de la conception de l’architecture, du code d’application et des opérations.

C’est souvent ce que vous supprimez plutôt que ce que vous ajoutez qui mène aux solutions les plus fiables. La simplicité réduit la surface exposée au contrôle, réduisant des inefficacités ainsi que les configurations incorrectes potentielles ou les interactions inattendues. D’autre part, la surimplification peut introduire des points de défaillance uniques. Maintenir une approche équilibrée.

Approche Avantage
Ajoutez des composants à votre architecture uniquement s’ils vous aident à atteindre les valeurs métier cibles. Gardez le chemin critique fluide. La conception pour les exigences métier peut entraîner une solution simple qui est facile à implémenter et à gérer. Évitez d’avoir trop de composants critiques, car chacun d’eux est un point de défaillance significatif.
Établissez des normes dans l’implémentation du code, le déploiement et les processus, et documentez-les. Identifiez les opportunités d’application de ces normes à l’aide de validations automatisées. Les normes fournissent une cohérence et réduisent les erreurs humaines. Les approches telles que les conventions d’affectation de noms standard et les guides de style de code peuvent vous aider à maintenir la qualité et à faciliter l’identification des ressources lors de la résolution des problèmes.
Évaluez si les approches théoriques se traduisent par une conception pragmatique qui s’applique à vos cas d’usage. Le code d’application trop granulaire peut entraîner une interdépendance inutile, des opérations supplémentaires et une maintenance difficile.
Développez un code suffisant. Vous serez en mesure d’éviter les problèmes résultant d’implémentations inefficaces, telles que la consommation de ressources inattendue, les échecs d’utilisateur ou de flux de données et les bogues de code.

À l’inverse, les problèmes de fiabilité doivent conduire à des révisions de code pour s’assurer que le code est suffisamment résilient pour gérer les problèmes.
Tirez parti des fonctionnalités fournies par la plateforme et des ressources prédéfinies qui peuvent vous aider à atteindre efficacement les objectifs métier. Cette approche réduit le temps de développement. Cela vous permet également de vous appuyer sur des pratiques éprouvées qui ont été employées avec des charges de travail similaires.

Étapes suivantes