Imaginez que vous achetiez une voiture. Quelles sont les caractéristiques essentielles dont vous avez besoin ? Un véhicule doit transporter une personne d’un point A à un point B. Mais ce que nous vérifions également, c’est la sécurité, le confort, la facilité d’entretien, la facilité de réparation ou un meilleur kilométrage.
Vous pouvez également rechercher une version électrique ou une meilleure vitesse. Pourquoi ? Pour limiter les surprises qui peuvent survenir dans l’accomplissement de la fonction première, c’est-à-dire transporter une personne du point A au point B.
De même, tout comme une voiture, une moto ou une maison, le logiciel a ses exigences non fonctionnelles appelées “caractéristiques architecturales”. Qu’il s’agisse d’un site Web, d’une application mobile ou de bureau, il doit posséder un ensemble d’attributs de qualité pour répondre aux besoins de l’utilisateur final.
Caractéristiques architecturales / Exigences non fonctionnelles
En bref, les exigences fonctionnelles définissent ce qu’un système est censé faire, comme dans le cas d’une voiture, transporter une personne de A à B, et les exigences non fonctionnelles stipulent comment un système est censé être.
Voici le schéma général des NFR (Non Functional Requirements) :
Ces 10 principales caractéristiques architecturales couvrent la plupart des aspects d’un projet à grande échelle. Vous n’avez pas besoin de toutes les intégrer dans votre projet ; choisissez les plus essentielles et mettez-les en œuvre.
Cet article ne fournit pas de solution à ces NFRs mais vous sensibilise aux domaines que vous devez prendre en compte lors de la conception d’un système.
Essayons de comprendre chacun d’entre eux :
Évolutivité (Scalability) :
La capacité du système à fonctionner à mesure que le nombre d’utilisateurs ou de demandes augmente. L’évolutivité peut être obtenue par une mise à l’échelle horizontale ou verticale de la machine ou simplement en attachant un AutoScalingGroup.
Modèle de trafic : Comprenez le modèle de trafic du système. Il n’est pas rentable de créer autant de machines que possible, même si elles sont sous-utilisées.
- Modèle diurne : Le trafic augmente le matin et diminue le soir pour une région particulière.
- Global / Régional : Forte utilisation de l’application.
- Troupeau tonnant (Thundering Herd) : De nombreux utilisateurs demandent des ressources, mais seules quelques machines sont disponibles pour répondre à l’explosion du trafic. Cela peut se produire aux heures de pointe ou dans les zones densément peuplées.
Elasticité : Capacité à faire naître rapidement quelques machines pour gérer l’explosion du trafic et à les réduire progressivement lorsque la demande diminue.
Latence : Capacité à répondre à la demande aussi rapidement que possible. Cela inclut également l’optimisation des algorithmes et la réplication du système à proximité des utilisateurs afin de réduire le temps d’aller-retour d’une requête. Une recherche google moyenne prend 400 ms.
Disponibilité (Availability)
Elle est mesurée en pourcentage du temps de fonctionnement et définit la proportion de temps pendant laquelle un système est fonctionnel et fonctionne. La disponibilité est affectée par les erreurs de système, les problèmes d’infrastructure, les attaques malveillantes et la charge du système.
Timbres de déploiement : Déployer plusieurs copies indépendantes de composants d’application, y compris les magasins de données.
Géodes : Déploiement de services dorsaux dans un ensemble de nœuds géographiques, chacun d’entre eux pouvant répondre à toute demande de client dans n’importe quelle région.
Extensibilité (Extensibility)
L’extensibilité mesure la capacité d’étendre un système et l’effort requis pour mettre en œuvre l’extension. L’extension peut se faire par l’ajout de nouvelles fonctionnalités ou la modification de fonctionnalités existantes. Ce principe permet d’apporter des améliorations sans porter atteinte aux fonctions actuelles du système.
Modularité / Réutilisabilité : La réutilisation, associée à l’extensibilité, permet de transférer la technologie vers un autre projet en réduisant le temps de développement et de maintenance, tout en améliorant la fiabilité et la cohérence.
Pluggabilité : Possibilité de brancher facilement d’autres composants, comme dans le cas de l’architecture micro-noyau.
Cohérence (Consistency)
La cohérence garantit que chaque lecture renvoie l’écriture la plus récente. Cela signifie qu’après l’exécution de chaque opération, les données sont cohérentes sur tous les nœuds, et donc que tous les clients voient les mêmes données au même moment, quel que soit le nœud auquel ils se connectent. La cohérence améliore la fraîcheur des données.
Résilience(Resiliency)
Un système peut gérer et récupérer gracieusement les défaillances accidentelles et malveillantes. La détection des défaillances et la récupération rapide et efficace sont nécessaires pour maintenir la résilience.
Récupérabilité : Les processus et fonctionnalités préparatoires vous permettent de remettre vos services dans un état de fonctionnement initial après un changement involontaire. Les changements involontaires incluent la suppression douce ou dure ou la mauvaise configuration des applications.
Reprise après sinistre : La reprise après sinistre (DR) consiste en de bonnes pratiques conçues pour prévenir ou minimiser les pertes de données et les interruptions d’activité résultant d’événements catastrophiques, qu’il s’agisse de pannes d’équipement, de coupures de courant localisées, de cyberattaques, d’urgences civiles, d’attaques criminelles ou militaires ou de catastrophes naturelles.
Design Patterns :
- Bulkhead : Isoler les éléments d’une application dans des pools de sorte que si l’un d’eux tombe en panne, les autres continuent de fonctionner.
- Disjoncteur (Circuit Breaker) : Gère les pannes qui peuvent prendre un temps variable à réparer lors de la connexion à un service ou à une ressource distante.
- Élection du leader : Coordonner les actions effectuées par une collection d’instances de tâches collaborant dans une application distribuée en élisant une instance comme leader qui assume la responsabilité de la gestion des autres instances.
Utilisabilité (Usability)
L’utilisabilité peut être décrite comme la capacité d’un système à fournir une condition permettant à ses utilisateurs d’effectuer les tâches de manière sûre, efficace et efficiente tout en appréciant l’expérience. Il s’agit du degré auquel des consommateurs spécifiés peuvent utiliser un logiciel pour atteindre des objectifs quantifiés avec efficacité, efficience et satisfaction dans un contexte d’utilisation quantifié.
Accessibilité : Mettre le logiciel à la disposition de personnes présentant le plus large éventail possible de caractéristiques et de capacités. Cela inclut les utilisateurs sourds, aveugles, daltoniens, etc.
Capacité d’apprentissage : les utilisateurs peuvent-ils apprendre facilement à utiliser le logiciel ?
Contrat API : pour les équipes internes, la compréhension des contrats API peut aider à se connecter facilement à n’importe quel système.
Observabilité (Observability)
L’observabilité est la capacité de collecter des données sur l’exécution du programme, les états internes des modules et la communication entre les composants. Pour améliorer l’observabilité, utilisez diverses techniques et outils de journalisation et de traçage.
Journalisation : Il existe différents types de journaux générés dans chaque requête : journaux d’événements, journaux de transactions, journaux de messages et journaux de serveurs.
Alertes et surveillance : Préparer des tableaux de bord de surveillance, créer des SLI (indicateurs de niveau de service) et configurer des alertes critiques.
L1 / L2 / L3 : Configurer le processus de support sur appel pour L1 / L2. Le support L1 comprend l’interaction avec les clients. Le support L2 gère les tickets qui lui sont envoyés par L1 et aide à résoudre les problèmes. L3 est la dernière ligne d’assistance et comprend généralement une équipe de développement qui s’occupe des problèmes techniques.
Sécurité (Security)
Degré auquel le logiciel protège les informations et les données de sorte que les personnes ou d’autres produits ou systèmes disposent du degré d’accès aux données correspondant à leurs types et niveaux d’autorisation. Cette famille de caractéristiques comprend la confidentialité (les données ne sont accessibles qu’aux personnes autorisées à y avoir accès), l’intégrité (le logiciel empêche l’accès ou la modification non autorisés du logiciel ou des informations), la non-répudiation (il est possible de prouver que des actions ou des événements ont eu lieu), la responsabilité (il est possible de retracer les actions d’un utilisateur) et l’authenticité (vérification de l’identité d’un utilisateur).
Auditabilité : Les pistes d’audit permettent de suivre l’activité du système de sorte qu’en cas de violation de la sécurité, il est possible de déterminer le mécanisme et l’étendue de la violation. Le stockage des pistes d’audit à distance, où elles peuvent uniquement être ajoutées, peut empêcher les intrus de couvrir leurs traces.
Légalité (Legality):
La conformité : Respectez les lois sur la protection des données telles que le GDPR, le CCPA, SOC2, PIPL ou FedRamp.
Confidentialité : Possibilité de cacher les transactions aux employés internes de l’entreprise (transactions cryptées pour que même les DBA et les architectes réseau ne puissent pas les voir).
Authentification : Exigences de sécurité pour garantir que les utilisateurs sont bien ceux qu’ils prétendent être.
Autorisation : Exigences de sécurité visant à garantir que les utilisateurs ne peuvent accéder qu’à certaines fonctions de l’application (par cas d’utilisation, sous-système, page web, règle de gestion, niveau de champ, etc.)
Durabilité (Durability)
La durabilité est la capacité d’une solution à assurer le fonctionnement d’un logiciel et à répondre aux besoins des utilisateurs pendant une période relativement longue.
Réplication : consiste à partager des informations pour assurer la cohérence entre des ressources redondantes afin d’améliorer la fiabilité, la tolérance aux pannes ou l’accessibilité.
Tolérance aux pannes : C’est la propriété qui permet à un système de continuer à fonctionner correctement en cas de défaillance d’une ou plusieurs pannes au sein de certains de ses composants.
Archivabilité : Les données devront-elles être archivées ou supprimées après un certain temps ? (Par exemple, les comptes clients seront supprimés après trois mois ou marqués comme obsolètes et archivés dans une base de données secondaire pour un accès futur).
Agilité (Agility)
C’est devenu le mot à la mode aujourd’hui pour décrire une méthode logicielle contemporaine. Une équipe agile associée pourrait être une équipe pratique capable de répondre de manière appropriée aux changements. La modification est ce que le développement de logiciels est très abondant.
Maintenabilité : quelle est la facilité d’appliquer des modifications et d’améliorer le système ? – Représente le degré d’efficacité et d’efficience avec lequel les développeurs peuvent modifier le logiciel pour l’améliorer, le corriger ou l’adapter aux changements d’environnement et d’exigences.
Testabilité : degré de facilité avec lequel les développeurs et d’autres personnes peuvent tester le logiciel.
Facilité de développement : degré auquel les développeurs peuvent modifier le logiciel sans introduire de défauts ou dégrader la qualité du produit existant.
Déployabilité : Le temps nécessaire pour mettre le code en production après avoir engagé le temps de déploiement.
Installabilité : La facilité d’installation du système sur toutes les plateformes nécessaires.
Possibilité de mise à niveau : Capacité à passer facilement/rapidement d’une version précédente de cette application/solution à une version plus récente sur les serveurs et les clients.
Portabilité : Le système doit-il fonctionner sur plus d’une plate-forme ? (Par exemple, le frontend doit-il fonctionner avec Oracle et SAP DB ?
Configurabilité : Les utilisateurs finaux peuvent facilement modifier certains aspects de la configuration du logiciel (grâce à des interfaces utilisables).
Compatibilité : Mesure dans laquelle un produit, un système ou un composant peut échanger des informations avec d’autres produits, conceptions ou membres et exécuter ses fonctions requises tout en partageant le même environnement matériel ou logiciel.
Conclusion
Maintenant que vous connaissez les NFR ou les caractéristiques architecturales, vous vous demandez peut-être laquelle répondra aux besoins de votre projet. Ou peut-être qu’elles sont toutes nécessaires dans chaque projet. Alors comment procéder pour adopter ces caractéristiques dans votre projet ?
Une fois que vous avez obtenu le besoin fonctionnel, essayez de trouver le goulot d’étranglement dans le système qui peut ajouter un obstacle à la fonction primaire. Et comment trouver le goulot d’étranglement ? Essayez de répondre à quelques-unes de ces questions :
Le système fonctionnera-t-il avec une base d’utilisateurs de 100M/1B ?
Mon système pourra-t-il traiter 10 000 demandes simultanées ?
Est-ce que je traite les données de manière sécurisée ?
Puis-je ajouter facilement de nouvelles fonctionnalités sans affecter les fonctionnalités existantes ?
et bien d’autres encore…
Certaines de ces questions peuvent aider à identifier les goulots d’étranglement ou les zones moins performantes qui sont des points de départ potentiels pour améliorer la fiabilité globale du système.
Ai-je manqué quelque chose ? Si oui, merci de contribuer à enrichir cet article en partageant vos réflexions dans les commentaires.
Avec cela, je conclus cet apprentissage ; j’espère que vous avez appris quelque chose de nouveau aujourd’hui. N’hésitez pas à partager avec d’autres collègues ou amis.