jeu, 27/01/2022 - 12:00
Les développeurs, les architectes et les ingénieurs DevOps ne se contentent plus du statu quo lorsqu'il s'agit de concevoir et de créer des applications. Ils sont fatigués des défis que représente le portage d'applications d'un cloud à un autre. Et ils ont fait l'expérience de la pression intense que représente la mise en place rapide d'une infrastructure de calcul supplémentaire pour répondre à une demande inattendue.
Les clients et les membres de la communauté nous disent de plus en plus souvent qu'ils veulent créer des "applications modernes". C'est pourquoi nous avons voulu créer une définition solide qui intègre tous les éléments essentiels requis. Cette définition peut alors servir de liste de contrôle et de point de référence pour suivre les étapes de développement et de conception d'applications.
Les quatre piliers d’une application moderne (en huit variantes) :
Au cours de nos recherches, nous avons entendu à maintes reprises que les applications modernes doivent posséder des attributs essentiels. Nous les avons répartis en quatre piliers : évolutivité, portabilité, résilience et agilité.
Pilier 1 : Évolutivité
L'évolutivité comporte deux éléments : l'expansion de la capacité de calcul et la vitesse d'expansion. Considérons-les dans le contexte de la " mise à l'échelle rapide " et de la " mise à l'échelle longue "
● Mise à l'échelle rapide. La capacité d'augmenter de 100 % la capacité d'une application en cinq minutes. Le fait de pouvoir doubler la capacité en si peu de temps implique qu'une application peut rapidement étendre sa capacité pour répondre à une augmentation imprévue de la demande.
● Mise à l'échelle longue. La capacité d'augmenter la capacité d'une application de 10x sur un an ou plus, sans nécessiter une refonte majeure du code ou de grands changements dans les exigences de l'infrastructure. Une appli moderne capable de passer à l'échelle longue est la résultante d'une conception propre avec des dépendances et des couplages lâches avec les composants d'infrastructure.
Pilier 2 : Portabilité
Même si les conteneurs sont largement utilisés aujourd'hui, les différences entre les cloud - en termes de dépendances, d'outils, de nuances de configuration, etc. - font qu'il n'est pas réaliste pour les entreprises de s'attendre à une portabilité instantanée lorsqu'elles tentent de passer à une architecture hybride multi-cloud. Une définition plus réaliste et plus appropriée de la portabilité devrait englober :
● La portabilité fonctionnelle. Les principaux éléments fonctionnels, le code et la logique d'une application doivent rester les mêmes quel que soit l'environnement dans lequel elle s'exécute. Cela signifie que le code s'exécute proprement à l'intérieur d'un conteneur sans dépendances externes étroitement couplées à un seul environnement.
● Portabilité de la gestion. Cela permet à l’application d'être surveillée, sécurisée et observée de la même manière - avec les mêmes outils et les mêmes ensembles de fonctionnalités de reporting - quel que soit l'environnement.
Pilier 3 : Résilience
La résilience en général peut décrire une haute disponibilité avec des accords de niveau de service stricts concernant les temps d'arrêt ou une fiabilité plus générale qui laisse de la place pour des temps d'arrêt plus longs voire des périodes pendant lesquelles il n'est pas nécessaire qu'une application soit en ligne. Un temps d’arrêt qui accepte la cohérence éventuelle et la fourniture de services comme étant suffisantes.
● La résilience face à l'utilisateur. Les utilisateurs d'applications, qu'il s'agisse de machines ou d'êtres humains, ne doivent jamais remarquer un problème de performance ou un problème causé par une défaillance ou une panne d'une appli moderne elle-même ou de tout service ou infrastructure dont elle dépend. Les défaillances se produisent inévitablement en cascade, impactant même les services automatisés et les microservices hautement dépendants.
● La résilience du basculement. Une app moderne est capable de restaurer en cinq minutes tout service critique à 100 % de ce qui est nécessaire pour gérer des charges de travail moyennes. Les concepteurs doivent penser au basculement vers des ressources de calcul non affectées comme étant un élément clé de la conception d'une application, implicite dans l'auto réparation et soucieux de l'environnement.
Pilier 4 : Agilité
Les équipes de développement d'applications bénéficient de l'agilité en accédant rapidement et facilement aux ressources dont elles ont besoin pour tester et développer de nouvelles fonctionnalités. Les équipes DevOps bénéficient de l'agilité grâce à une vérification et un déploiement simplifié et automatisé du code et de l'infrastructure.
● L’agilité du code. L'application elle-même doit être conçue pour absorber constamment du nouveau code. Dans la plupart des cas, cela signifie qu'une application est composée de microservices et reliée par des API afin d'appliquer un couplage lâche et réduire les dépendances et la rigidité du code intra-application.
● L'agilité de l'infrastructure. La capacité de faire tourner l'infrastructure à la hausse ou à la baisse pour satisfaire les besoins de tous les clients, y compris les équipes de développement d'applications, les équipes de sécurité et les équipes DevOps.
Les six principes des applications modernes
Pour satisfaire aux quatre piliers des applications modernes, la plupart des applications modernes utilisent des architectures qui suivent plusieurs de ces six principes :
1. Être agnostique en termes de plateforme. Cela signifie qu'une application est conçue pour fonctionner sans tenir compte des plates-formes ou des environnements où elle est susceptible de s'exécuter ; l’utilisation de conteneurs, incluant les fichiers, sources et librairies permettant à l’application de s’exécuter offre dans ce sens un meilleur niveau de portabilité.
2. Donner la priorité aux logiciels à minima « open source », voire libre. Étant donné que les applications modernes exigent que les équipes soient en mesure de regarder sous le capot du code afin de concevoir la portabilité et l'évolutivité, l'utilisation de logiciels « open source » dans la mesure du possible est importante pour maintenir la dynamique des applications modernes.
3. Tout définir (dans la mesure du possible) par le code. Les applications modernes doivent évoluer à une vitesse supérieure à celle de l'homme. La définition par le code des paramètres de l’application, de ses besoins en termes d’infrastructure et de sécurité vont permettre un déploiement, une mise à l’échelle ou un plan de reprise sans intervention humaine.
4. Utiliser naturellement les concepts et outils de CI/CD en bannissant toute forme d’intervention manuelle dans l’intégration et le déploiement de ses applications vont permettre en s’associant aux points 1 et 3 de tester, déployer, faire évoluer ou croitre ses applications à une vitesse inégalable en minimisant les possibilités d’erreurs.
5. Intégrer la sécurité dans l’intégration et le déploiement applicatif. Cela signifie qu'il faut tester tout le code le plus tôt possible dans le processus de développement en utilisant l'analyse de la composition du logiciel (SCA), les tests statiques de sécurité des applications (SAST), l'analyse dynamique du code (DCA) et les vérificateurs de formatage. Pour les équipes DevOps, cela signifie également adopter les principes de type « secure by design ».
6. Répartir largement le stockage et l'infrastructure. Répliquer le stockage et le calcul sur plusieurs zones ou clouds ou sur des déploiements hybrides peut garantir une plus grande résilience et une meilleure évolutivité.
Ainsi, les applications modernes sont tout à la fois une liste de contrôle et un état d'esprit. Comme le chat de Schrödinger, s'efforcer de mettre en place des applications modernes implique d'exister simultanément dans deux états. Il y a le monde réel des environnements cloud et hybrides actuels, et les contraintes de temps et de budget dans lesquelles nous développons et fournissons des applications. Et il y a le monde idéal des applications modernes parfaites, entièrement automatisées, hautement sécurisées, totalement agnostiques et instantanément évolutives.
La réalité est, bien sûr, désordonnée et nous pensons qu’il nous faudra modifier notre définition à mesure que le monde de la technologie évoluera et se développera.
Il existe déjà des modèles logiciels qui ne correspondent pas exactement à cette définition : l'informatique sans serveur (le serverless), les plateformes d'applications Low-code/No-code de plus en plus sophistiquées et les applications de sécurité basées sur l'intelligence artificielle, les CDN avec une capacité de calcul en périphérie, etc. Mais dans son état actuel, nous espérons qu'elle pourra guider tous ceux - utilisateurs, développeurs et toutes autres parties prenantes - qui souhaitent créer des applications de la meilleure façon possible.
A propos de l'auteur