Publié le : 03/06/2023 à 03:40

Un guide détaillé sur la méthodologie des 12 facteurs pour le développement d'applications modernes et scalables dans des environnements cloud. La conception à douze facteurs vous permet de dissocier les composants de l'application, lesquels peuvent ainsi être remplacés, augmentés ou réduits facilement. Les facteurs étant indépendants de tout langage de programmation et de toute pile logicielle, la conception à douze facteurs peut être appliquée à une grande variété d'applications.

Introduction

Explication des principes des applications 12 facteurs, une méthodologie conçue pour les applications modernes et les microservices, permettant une meilleure maintenabilité, scalabilité et déploiement en continu.

Codebase

Une seule base de code par application avec gestion de versions.

Principe

Chaque application doit avoir une seule base de code versionnée dans un dépôt, même si elle est déployée dans plusieurs environnements. Cela garantit la cohérence du code entre les environnements.

Gestion des versions

L'utilisation de systèmes de contrôle de version (ex. Git) permet de maintenir des versions de l'application et de faciliter le suivi des modifications.

Bénéfices

Améliore la traçabilité, la collaboration et la gestion des versions pour les équipes, surtout en environnement agile.

Dépendances

Déclarer explicitement et isoler les dépendances de l'application.

Déclaration explicite

Spécifiez toutes les dépendances de l'application dans un fichier de configuration (comme requirements.txt pour Python ou package.json pour Node.js) pour faciliter l'installation et la maintenance.

Isolation des dépendances

Utiliser des environnements isolés pour chaque application (ex. virtualenv en Python, conteneurs Docker) pour éviter les conflits de dépendances entre projets.

Configuration

Externaliser les configurations pour séparer le code et les paramètres d'environnement.

Variables d'environnement

Utiliser des variables d'environnement pour stocker les configurations de l'application, comme les clés API, URL de base de données, etc. Cela évite d'exposer des informations sensibles dans le code.

Flexibilité et sécurité

Les configurations par environnement permettent de déployer la même base de code dans différents environnements (dev, prod) sans modification du code.

Backing Services

Traiter les services externes (base de données, files d'attente) comme des ressources attachées.

Ressources interchangeables

Les services externes doivent être facilement remplaçables sans modifier le code, en changeant uniquement la configuration. Cela facilite la migration vers de nouvelles solutions.

Portabilité

En utilisant des services basés sur des configurations externes, il devient facile de déplacer l'application vers d'autres environnements ou fournisseurs.

Build, Release, Run

Distinguer les étapes de build, release et run pour une meilleure gestion des déploiements.

Processus de build

Le processus de build compile le code et regroupe toutes les dépendances, générant une version déployable de l'application.

Processus de release

Associe le build à des configurations spécifiques et enregistre cette version prête pour le déploiement. Chaque release doit être immuable et identifiable (ex. par un numéro de version ou un tag).

Processus de run

L'étape où le code est exécuté dans l'environnement de production. Cette séparation améliore la gestion des versions et facilite les rollbacks en cas de besoin.

Processes

Exécuter l'application sous forme de processus stateless pour favoriser la scalabilité.

État dans les services

Les processus ne doivent pas conserver d'état ; ils doivent utiliser des services externes (comme une base de données) pour stocker l'état de l'application.

Scalabilité horizontale

Les processus stateless permettent d'ajouter ou retirer facilement des instances, augmentant la capacité d'accueil sans impact sur la cohérence des données.

Port Binding

L'application doit être auto-contenue et exposée via un port spécifique.

Communication via le réseau

L'application doit être accessible directement via un port, facilitant le déploiement dans des environnements comme Docker ou Kubernetes.

Flexibilité des services

Permet de combiner différents services dans un même environnement en les assignant chacun à un port spécifique.

Concurrency

Optimiser l'application pour fonctionner avec plusieurs processus concurrents.

Modèle de process horizontal

Utiliser des processus indépendants et scalables en parallèle, ce qui facilite la gestion de charges de travail variables.

Multiprocessing

Adopter des modèles de traitement parallèle pour maximiser l'utilisation des ressources.

Disposability

Faciliter le démarrage et l'arrêt rapides des processus.

Démarrage rapide

Les processus doivent démarrer rapidement pour être réactifs face aux charges de travail fluctuantes.

Gestion de l'arrêt

En cas d'arrêt, les processus doivent cesser de façon contrôlée pour éviter les corruptions de données.

Dev/Prod Parity

Maintenir une parité forte entre les environnements de développement, staging et production.

Parité des environnements

Éviter les divergences entre les différents environnements pour minimiser les risques d’erreurs lors des déploiements.

Amélioration des tests

Une parité de configuration améliore la fiabilité des tests en garantissant que ce qui est testé en développement fonctionnera en production.

Logs

Les logs sont un flux d'événements à centraliser pour une analyse efficace.

Flux continu

Les logs doivent être traités comme un flux d'événements continus, collectés et centralisés, sans être enregistrés localement dans le fichier système.

Centralisation

Envoyer les logs vers un service centralisé facilite la surveillance et le dépannage des applications en production.

Admin Processes

Les tâches administratives sont gérées en tant que processus one-off.

Processus ponctuels

Exécuter les tâches de maintenance ou d'administration comme des processus isolés, ex. en utilisant des scripts one-off pour des migrations de base de données ou des traitements ponctuels.

Sécurité et stabilité

Les processus one-off évitent les interférences avec le code en cours d’exécution et garantissent la stabilité de l'application.

Lien copié dans le presse-papiers !