Principes de conception de la fiabilité

Les pannes et les dysfonctionnements sont de sérieuses préoccupations pour toutes les charges de travail. Une charge de travail fiable doit survivre à ces événements et continuer à fournir systématiquement les fonctionnalités prévues. Il doit être résilient afin de pouvoir détecter et résister aux défaillances et s’en remettre dans un laps de temps acceptable. Il doit également être disponible pour que les utilisateurs puissent 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 des échecs ne se produisent pas, en particulier lorsque la charge de travail est conçue pour s’exécuter sur des systèmes distribués. Certains composants peuvent échouer tandis que d’autres continuent de fonctionner. À un moment donné, l’expérience utilisateur peut être affectée, ce qui compromet les objectifs de l’entreprise.

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 peut être des interruptions de service qui entraînent des pertes financières. Dans le cas de charges de travail critiques, le fait de ne pas appliquer ces principes pourrait compromettre la sécurité.

Concevoir en fonction des besoins métier

Icône Objectif Rassemblez les besoins de l’entreprise en vous concentrant sur l’utilité prévue de la charge de travail.

Les exigences doivent couvrir l’expérience utilisateur, les données, les workflows et les caractéristiques propres à la charge de travail. Le résultat du processus des exigences doit indiquer clairement les attentes. Les objectifs doivent être réalisables et négociés avec l’équipe, compte tenu d’un investissement spécifié. Ils doivent être documentés pour diriger les choix technologiques, les implémentations et les opérations.

Approche Avantage
Quantifier la réussite en définissant des cibles sur des indicateurs pour les composants individuels, les flux système et le système dans son ensemble. Ces objectifs rendent-ils les flux d’utilisateurs plus fiables ? Les métriques quantifient les attentes. Ils vous permettent de comprendre les complexités et de déterminer si les coûts en aval de ces complexités se trouvent dans la limite d’investissement.

Les valeurs cibles indiquent un état idéal. Vous pouvez utiliser les valeurs comme seuils de test qui vous aident à détecter les écarts par rapport à cet état et le temps nécessaire pour revenir à l’état cible.

Les exigences de conformité doivent également avoir des résultats prévisibles pour les flux dans l’étendue. La hiérarchisation de ces flux attirera l’attention sur les domaines les plus sensibles.
Comprendre les engagements de la plateforme. Tenez compte des limites, des quotas, des régions et des contraintes de capacité pour les services. Les contrats de niveau de service (SLA) varient selon le service. Tous les services et fonctionnalités ne sont pas couverts de la même manière. Tous les services ou fonctionnalités ne sont pas disponibles dans toutes les régions. La plupart des limites de ressources d’abonnement sont par région. Une bonne compréhension de la couverture et des limites peut vous aider à détecter la dérive et à créer des mécanismes de résilience et de récupération.
Déterminez les dépendances et leur effet sur la résilience. Le suivi de l’infrastructure, des services, des API et des fonctions dépendants développés par d’autres équipes ou des tiers vous aide à déterminer si la charge de travail peut fonctionner en l’absence de ces dépendances. Il vous aide également à comprendre les défaillances en cascade et à améliorer les opérations en aval.

Les développeurs peuvent implémenter des modèles de conception résilients pour gérer les défaillances potentielles lorsque vous utilisez des services externes susceptibles de subir des défaillances.

Conception pour 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 des dysfonctionnements des composants, des pannes de plateforme, des dégradations des performances, une disponibilité limitée des ressources et d’autres erreurs se produisent. Développez la résilience dans le système afin qu’il soit tolérant aux pannes et qu’il puisse se dégrader correctement.

Approche Avantage
Distinguez les composants qui se trouvent sur le chemin critique de ceux qui peuvent fonctionner dans un état dégradé. Tous les composants de la charge de travail ne doivent pas être aussi fiables. La détermination de la criticité vous aide à concevoir en fonction de la criticité de chaque composant. Vous n’aurez pas la résilience de l’ingénierie pour les composants qui pourraient légèrement dégrader l’expérience utilisateur, contrairement aux composants qui peuvent causer des problèmes de bout en bout en cas d’échec.

La conception peut être efficace pour allouer des ressources aux 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égradé, il puisse être isolé pour éviter les défaillances en cascade.
Identifiez les points de défaillance 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 de défaillance, le rayon d’explosion et l’intensité de la panne : panne totale ou partielle. Cette analyse influence la conception des fonctionnalités de gestion des erreurs au niveau des composants.
Créez des fonctionnalités d’auto-conservation en utilisant des modèles de conception correctement et en modularisant la conception pour isoler les erreurs. Le système sera en mesure d’éviter qu’un problème n’affecte les composants en aval. Le système sera en mesure d’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 pourrez également réduire le rayon d’explosion.
Ajoutez la capacité de 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 et les fluctuations de capacité variables. Cette fonctionnalité est cruciale en cas de 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 de capacité de ressources temporaires potentielles ou d’autres problèmes affectant 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, en cas de panne de composant, zonale ou régionale, le déploiement redondant (actif-actif ou actif-passif) vous permet d’atteindre les objectifs de temps de fonctionnement.

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.
Surprovisionnement pour atténuer immédiatement les défaillances individuelles d’instances redondantes et pour mettre en mémoire tampon contre la consommation de ressources qui s’emballe. Un investissement plus élevé dans le surprovisionnement augmente la résilience.

Le système continuera à fonctionner à plein temps pendant une défaillance active, même avant que les opérations de mise à l’échelle puissent commencer à corriger la défaillance. De même, vous pouvez réduire le risque d’un emballement inattendu de la consommation de ressources qui réclame votre mémoire tampon planifiée, en obtenant un temps de tri critique, avant que des erreurs système ou une mise à l’échelle agressive ne se produisent.

Conception pour la récupération

Icône Objectif La charge de travail doit être en mesure d’anticiper et de récupérer la plupart des défaillances, de toutes les ampleurs, 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 sinistres, à la fois dans la conception de l’architecture et les opérations de charge de travail. Sur la couche de données, vous devez disposer de stratégies qui peuvent réparer l’état de la charge de travail en cas d’altération.

Approche Avantage
Avoir des plans de récupération structurés, testés et documentés qui sont 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 permet une récupération rapide qui peut éviter un impact négatif sur les finances et la réputation de votre entreprise. La réalisation d’exercices de récupération réguliers teste le processus de récupération des composants système, des données et des étapes de basculement et de restauration automatique pour éviter toute confusion lorsque le temps et l’intégrité des données sont des mesures clés de la réussite.
Assurez-vous que vous pouvez réparer les données de tous les composants avec état dans vos cibles de récupération. Les sauvegardes sont essentielles pour rétablir l’état de fonctionnement du système à 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 d’arrêt-réparation.
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, en réduisant les interruptions.

Penser la conception des applications pour les opérations

Icône Objectif Basculez vers la gauche dans les opérations pour anticiper les conditions de défaillance.

Testez les échecs au début et souvent au cours du cycle de vie du développement, et déterminez l’impact des performances sur la fiabilité. Pour l’analyse de la cause racine et les post-mortems, vous devez avoir une visibilité partagée, entre les équipes, des status de dépendance et des défaillances en cours. Les insights, les diagnostics et les alertes des systèmes observables sont fondamentaux pour une gestion efficace des incidents et l’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 surveillance et la diagnostics sont des opérations cruciales. Si un problème échoue, vous devez savoir qu’il a échoué, quand il a échoué et pourquoi il a échoué. L’observabilité au niveau des composants est fondamentale, mais l’observabilité agrégée des composants et des flux d’utilisateurs corrélés fournit une vue holistique de l’intégrité status. Ces données sont nécessaires pour permettre aux ingénieurs de fiabilité du site de hiérarchiser leurs efforts de correction.
Prédire les dysfonctionnements potentiels et le comportement anormal. Rendez les échecs de fiabilité actifs visibles à l’aide d’alertes prioritaires et actionnables.

Investir dans des processus et une infrastructure fiables qui permettent un tri plus rapide.
Les ingénieurs en fiabilité du site peuvent être avertis immédiatement afin d’atténuer les incidents de site en direct en cours et d’atténuer de manière proactive les défaillances potentielles identifiées par les alertes prédictives avant qu’elles ne deviennent des incidents en direct.
Simulez les défaillances et exécutez des tests dans des environnements de production et de préproduction. Il est utile de rencontrer des échecs en production afin de définir des attentes réalistes en matière de récupération. Cela vous permet de faire des choix de conception qui répondent de manière appropriée aux échecs. En outre, il vous permet de tester les seuils que vous définissez pour les métriques d’entreprise.
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.
Tenez compte des opérations de routine et de leur impact sur la stabilité du système. La charge de travail peut être soumise à des opérations en cours, telles que des révisions d’application, des audits de sécurité et de conformité, des mises à niveau de composants et des processus de sauvegarde. L’examen de ces modifications garantit la stabilité du système.
Apprenez en permanence des incidents en production. En fonction des incidents, vous pouvez déterminer l’impact et les omissions dans la conception et les opérations qui peuvent passer inaperçues lors de la préproduction. En fin de compte, vous serez en mesure de générer des améliorations en fonction des incidents réels.

La simplicité avant tout

Icône Objectif Évitez de suringérer la conception de l’architecture, le code d’application et les opérations.

C’est souvent ce que vous supprimez plutôt que ce que vous ajoutez qui conduit aux solutions les plus fiables. La simplicité réduit la surface de contrôle, réduisant ainsi les inefficacités et les erreurs de configuration potentielles ou les interactions inattendues. D’autre part, une simplification excessive 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. Maintenez le chemin critique allégée. La conception pour les besoins métier peut aboutir à une solution simple, facile à implémenter et à gérer. Évitez d’avoir trop de composants critiques, car chacun d’eux est un point de défaillance important.
Établissez des normes dans l’implémentation du code, le déploiement et les processus, et documentez-les. Identifiez les possibilités d’appliquer ces normes à l’aide de validations automatisées. Les normes assurent la cohérence et réduisent les erreurs humaines. Des approches telles que les conventions de nommage 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 juste assez de code. Vous serez en mesure d’éviter les problèmes qui sont le résultat d’implémentations inefficaces, comme la consommation inattendue de ressources, les échecs de flux de données ou d’utilisateurs et les bogues de code.

À l’inverse, les problèmes de fiabilité doivent entraîner 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 vos objectifs métier. Cette approche réduit le temps de développement. Il vous permet également de vous appuyer sur des pratiques éprouvées qui ont été utilisées avec des charges de travail similaires.

Étapes suivantes