Prototyper en quelques semaines : une architecture d’application web qui passe à l’échelle quand il le faut

Prototypez en quelques semaines avec un monolithe modulaire, tracez les flux clés et n’extrayez un service que s’il doit scaler ou être isolé. Kreante...

Tools
Kreante5 septembre 2026il y a 23 heures
Architect tracing a web application request path

L’architecture d’une application web est le plan qui définit comment le client, le serveur, les données et l’infrastructure d’une application dialoguent entre eux. Le principe qui compte plus que n’importe quel choix de framework, c’est la modularité : des frontières nettes entre les composants, pour que chacun puisse évoluer, monter en charge ou tomber en panne sans entraîner les autres avec lui. Pour presque toutes les équipes, le point de départ pratique est le monolithe modulaire, avec des déclencheurs définis à l’avance qui indiquent quand et comment détacher des services en microservices.


TL;DR :

La plupart des équipes devraient commencer par un monolithe modulaire, en créant une séparation nette entre les composants pour permettre une montée en charge future ou une extraction en microservices.
Les bases de données relationnelles comme PostgreSQL, ainsi que Redis, sont les choix par défaut recommandés, avec du cache et des réplicas de lecture pour améliorer les performances au besoin.
Les options de déploiement vont de Kubernetes, pour le contrôle, aux runtimes serverless managés, pour la simplicité, le choix dépendant de la taille de l’équipe, du profil de trafic et de la capacité opérationnelle.
La montée en charge et la tolérance aux pannes reposent sur un couplage faible, des services sans état et des schémas résilients comme les nouvelles tentatives, les disjoncteurs et la dégradation gracieuse.
Priorisez la définition de frontières de modules calquées sur le produit et la mise en place de la traçabilité dès le début, plutôt que de surdimensionner pour une échelle future qui ne sera peut-être jamais nécessaire.

Qu’est-ce que l’architecture d’une application web et quels sont ses composants clés ?

L’architecture d’une application web décrit comment ses différentes pièces s’assemblent : qui parle à qui, où vivent les données et comment une requête voyage du navigateur à la base de données, puis revient. Toute application web, quelle que soit sa taille, est construite à partir de la même poignée de couches. Les comprendre est le moyen le plus rapide de déchiffrer n’importe quel schéma d’architecture que vous croiserez.

Le client, c’est tout ce qui s’exécute dans le navigateur ou l’application mobile de l’utilisateur, qu’il s’agisse d’un front end React ou d’une page rendue côté serveur. Il communique avec le backend via une API, souvent placée derrière une passerelle qui gère le routage, la limitation de débit et les contrôles d’authentification avant même qu’une requête n’atteigne le code de votre application. Google Cloud propose un modèle d’application web à trois niveaux qui illustre clairement ce flux. Un répartiteur de charge dirige le trafic vers le front end, qui appelle une couche API, laquelle lit dans un cache avant de se rabattre sur la base de données.

La couche applicative est celle où vit la logique métier : traitement des commandes, contrôle des permissions, règles de tarification, tout ce qui est propre à ce que fait réellement votre produit. Cette couche se scinde souvent entre des gestionnaires de requêtes (rapides, synchrones) et des workers d’arrière-plan (tâches plus lentes comme l’envoi d’e-mails ou la génération de rapports), pour qu’une tâche lente ne bloque jamais le chargement d’une page.

La couche de données contient votre base de données principale, les réplicas de lecture qui permettent de scaler les lectures et les caches comme Redis pour tout ce qui est interrogé de façon répétée. En dessous se trouve l’infrastructure : les réseaux de diffusion de contenu (CDN) pour les ressources statiques, les répartiteurs de charge pour distribuer le trafic, les fournisseurs d’identité pour l’authentification et les outils de supervision qui vous préviennent quand quelque chose casse.

Un moyen rapide de retenir l’ensemble :

  • Couche client : interface navigateur ou mobile, ne parle qu’à l’API
  • Couche API/passerelle : routage, contrôles d’authentification, limitation de débit
  • Couche applicative : logique métier, gestionnaires de requêtes, workers d’arrière-plan
  • Couche de données : base de données principale, réplicas, caches
  • Couche d’infrastructure : CDN, répartiteur de charge, fournisseur d’identité, supervision

Tous les patterns évoqués ci-dessous ne sont que des façons différentes d’agencer ces cinq couches.

Monolithe, microservices ou quelque chose entre les deux ? Comparaison des grands patterns

Chaque pattern d’architecture est en réalité une décision sur l’endroit où tracer les frontières et sur la complexité opérationnelle que vous acceptez de porter en échange de la flexibilité obtenue. Voici comment les principaux se comparent.


  1. Monolithe. Une seule base de code, un seul déploiement, une seule base de données. Tout part ensemble. C’est le moyen le plus rapide de mettre un produit sur le marché, car il n’y a ni surcoût réseau entre les composants ni découverte de services à configurer. Le prix se paie plus tard : un bug dans une fonctionnalité peut faire tomber toute l’application, et chaque déploiement touche à tout, ce qui rend les mises en production plus risquées à mesure que l’équipe grandit.

  2. Monolithe modulaire. Même déploiement unique, mais la base de code est découpée en modules internes aux frontières réelles, chacun rattaché à une capacité produit comme Auth, Billing ou Search plutôt qu’à une simple arborescence de dossiers. C’est le pattern que les guides de praticiens recommandent de plus en plus comme point de départ, car un module correctement délimité peut être extrait plus tard en un microservice déployable indépendamment sans réécriture. Un module qui n’est qu’un dossier, sans frontière imposée, ne le permet pas — les conseils pratiques sur la conception de workflows SaaS scalables montrent comment créer ces frontières efficacement.

  3. Architecture en couches (N-tier). Les requêtes traversent des couches strictes : présentation, logique métier, accès aux données. C’est facile à comprendre et à faire prendre en main par de nouveaux développeurs, mais un découpage strict peut créer des indirections inutiles pour de simples opérations CRUD, et il a tendance à concentrer toutes les règles métier au même endroit, quelle que soit leur diversité réelle.

  4. Architecture clean (hexagonale). Les dépendances pointent vers l’intérieur, vers la logique métier au cœur du système, et l’infrastructure implémente des interfaces définies par ce cœur plutôt que l’inverse. Les recommandations de Microsoft Learn sur la Clean Architecture y voient le moyen de remplacer une base de données, une file d’attente ou une API tierce sans toucher aux règles métier. C’est sur les produits à longue durée de vie, dont l’infrastructure changera plus d’une fois, que cela paie le plus.

  5. Microservices. Des services indépendants, chacun avec sa propre base de données, déployés et mis à l’échelle séparément. Vous y gagnez une montée en charge indépendante et l’isolation des pannes, mais vous y ajoutez de la latence réseau, du débogage distribué et une vraie facture d’orchestration. En dessous d’une dizaine d’ingénieurs, les équipes ressentent généralement ce coût avant d’en ressentir le bénéfice.

  6. Serverless. Des fonctions qui s’exécutent à la demande et descendent jusqu’à zéro, le fournisseur cloud gérant entièrement les serveurs. Excellent pour les charges irrégulières ou peu fréquentes, avec un coût opérationnel quasi nul, mais les démarrages à froid et les limites d’exécution propres à chaque fournisseur en font un mauvais choix pour les traitements sensibles à la latence ou de longue durée.

  7. Architecture pilotée par les événements. Les services communiquent par événements plutôt que par appels directs, ce qui découple les producteurs des consommateurs et lisse les pics de trafic. C’est très adapté aux workflows asynchrones comme la préparation de commandes ou les chaînes de notification, mais cela introduit une réelle complexité autour de l’ordre des messages et des livraisons en double, à laquelle un système requête/réponse simple n’a jamais à penser.

Choisissez en fonction de la taille de l’équipe et de la cadence de livraison, plus que des projections de trafic. Une équipe de quatre personnes qui livre chaque semaine a rarement besoin de microservices ; une organisation de cinquante personnes qui livre plusieurs fois par jour et par équipe ne peut souvent pas les éviter.

Concevoir pour la montée en charge : couplage faible, services sans état et reprise sur panne

La scalabilité n’est pas une fonctionnalité que l’on ajoute après coup. C’est un ensemble de décisions de conception prises tôt, qui permettent à un système de grandir sereinement ou imposent une réécriture sous pression.

L’architecture par unités d’échelle regroupe des composants liés en une unité autonome, déployable et scalable dans son ensemble, au lieu de buter sur le plafond d’une base de données ou d’une ressource de calcul unique. Les conceptions de systèmes critiques utilisent ce pattern pour déployer des « stamps » régionaux entiers, de sorte qu’une limite de capacité dans une unité ne devienne jamais une limite pour tout le produit. Les recommandations de Google Cloud sur les applications scalables et résilientes présentent les services sans état et le couplage faible comme les deux conditions préalables qui rendent cela possible : un autoscaler ne peut ajouter ou retirer des instances en toute sécurité que si aucune instance ne détient des données de session dont dépend une autre requête.

Le couplage faible compte autant entre les services qu’à l’intérieur de chacun. Quand le service A n’a pas besoin de connaître les détails internes du service B pour travailler avec lui, l’un comme l’autre peut évoluer, monter en charge ou tomber en panne de façon indépendante. C’est toute la justification de la conception événementielle : au lieu que le service A appelle directement le service B et attende une réponse, A publie un événement et passe à autre chose. Des brokers de messages comme Kafka, RabbitMQ ou SQS absorbent les pics de trafic et évitent qu’un service aval lent ne fasse tomber un service amont rapide, même s’ils apportent leurs propres soucis d’ordre des messages et de livraisons en double, à traiter explicitement.

C’est là que les patterns de résilience prennent tout leur sens :

  • La nouvelle tentative avec temporisation progressive gère les pannes passagères (un incident réseau, un service momentanément surchargé) sans marteler une dépendance déjà en difficulté.
  • Le disjoncteur (circuit breaker) cesse complètement d’appeler un service défaillant dès que le taux d’erreur dépasse un seuil, ce qui lui laisse de la place pour se rétablir au lieu d’ajouter de la charge.
  • La dégradation gracieuse maintient les fonctions essentielles en vie même quand une dépendance non critique est indisponible (afficher des recommandations en cache plutôt que faire échouer toute la page).
  • Le pattern Saga coordonne des transactions en plusieurs étapes entre services sans verrou distribué, en utilisant des actions compensatoires pour annuler le travail partiel si une étape ultérieure échoue.

Conseil de pro : Ajoutez des clés d’idempotence à tout endpoint qu’une nouvelle tentative pourrait atteindre deux fois. Sans elles, une demande de paiement ou de commande rejouée peut débiter un client deux fois, et ce bug n’apparaît généralement que sous charge réelle, pas en phase de test.

Choisir la bonne couche de données sans la surdimensionner

Le choix de la base de données est l’une des rares décisions d’architecture réellement difficiles à défaire par la suite : il mérite donc plus de réflexion qu’un « qu’est-ce qu’on avait pris sur le dernier projet ? ».

Les bases de données relationnelles (PostgreSQL, MySQL) restent le bon choix par défaut pour la plupart des applications, parce que la plupart des données métier sont réellement relationnelles : les commandes appartiennent à des clients, les factures à des commandes. Les magasins NoSQL (MongoDB, DynamoDB) trouvent leur place quand vos schémas d’accès se résument à de simples recherches par clé à très gros volume, ou quand votre modèle de données ne rentre vraiment pas dans des lignes et des jointures, comme des documents profondément imbriqués ou des relations de graphe. Les conseils de praticiens sur l’architecture en phase initiale convergent généralement vers une combinaison PostgreSQL plus Redis comme socle par défaut solide, précisément parce qu’elle évite de s’engager sur une infrastructure spécialisée avant de savoir que vous en avez besoin.

Le cache est le changement à plus fort levier que la plupart des équipes sous-utilisent. Quelques règles empiriques :

  • Le cache en périphérie (CDN) pour les ressources statiques et toute réponse identique pour chaque utilisateur.
  • Le cache applicatif (Redis, Memcached) pour les requêtes coûteuses ou les résultats calculés qui changent rarement.
  • Les réplicas de lecture dès que votre base de données principale peine sous le trafic de lecture, puisque les réplicas déchargent les lectures sans toucher à la capacité d’écriture.
  • Le partitionnement ou le sharding seulement quand une instance de base de données unique arrive vraiment à saturation, car cela ajoute une réelle complexité opérationnelle en échange d’une mise à l’échelle horizontale.

Pour les domaines complexes à écriture intensive, le CQRS (Command Query Responsibility Segregation) sépare les lectures et les écritures en deux modèles distincts, parfois adossés à de l’event sourcing. C’est puissant pour un système de gestion de commandes aux fortes exigences d’audit, et démesuré pour un site de contenu basique. La plupart des équipes devraient traiter le CQRS comme un outil pour un problème précis, pas comme un choix par défaut.

Conteneurs, serverless ou runtimes managés : choisir son modèle de déploiement

Les choix de déploiement déterminent la quantité de travail opérationnel que votre équipe accepte d’assumer, et cet arbitrage se manifeste plus vite que la plupart des équipes ne l’imaginent.

L’orchestration de conteneurs, typiquement Kubernetes, vous donne un contrôle fin sur le réseau, les politiques de mise à l’échelle et l’allocation des ressources. Ce contrôle a un vrai coût : quelqu’un dans votre équipe doit maîtriser la gestion de cluster, et ce n’est pas un travail à temps partiel dès lors que vous encaissez du trafic de production. Les runtimes serverless managés comme Cloud Run, AWS Fargate ou AWS Lambda transfèrent cette charge opérationnelle au fournisseur cloud, en échange de moins de contrôle sur l’environnement sous-jacent. Les recommandations de Microsoft sur l’architecture de base d’App Service sont explicites : une configuration simple convient pour une preuve de concept, mais le trafic de production exige de l’autoscaling, un vrai modèle de santé et un stockage sécurisé des secrets par-dessus avant d’être fiable.

Un repère sommaire pour choisir :

  • Kubernetes quand vous avez plusieurs services aux besoins de mise à l’échelle différents et une équipe capable de prendre le cluster en charge.
  • Le serverless managé (Cloud Run, Fargate, Lambda) quand vous voulez une infrastructure de production sans ingénieur plateforme dédié.
  • Une passerelle d’API pour centraliser l’authentification, la limitation de débit et le routage entre services, afin que chaque service ne le réimplémente pas de son côté.
  • Un répartiteur de charge pour distribuer le trafic entre les instances et absorber la perte de n’importe laquelle d’entre elles.
  • Des pipelines CI/CD avec construction automatisée des images, gestion des secrets et déploiements progressifs (canary ou bleu/vert) pour détecter les problèmes avant qu’ils n’atteignent tous les utilisateurs d’un coup.

Une checklist de décision pour choisir votre architecture

La plupart des équipes réfléchissent trop au choix initial et pas assez aux portes de sortie. Déroulez plutôt cette checklist.

  1. Taille de l’équipe. En dessous de dix ingénieurs, un monolithe modulaire surpasse presque toujours les microservices en vitesse de livraison, puisqu’il n’y a pas de taxe de coordination entre services sur chaque fonctionnalité.
  2. Cadence de livraison. Livrer une fois par semaine plaide pour un monolithe aux frontières de modules solides. Livrer plusieurs fois par jour avec des équipes indépendantes commence à justifier l’extraction de services.
  3. Profil de trafic. Une charge stable et prévisible n’a que rarement besoin de plus que des groupes d’autoscaling. Des pics brusques et imprévisibles (ventes flash, contenu viral) justifient des fonctions serverless ou des conceptions par unités d’échelle.
  4. Budget opérationnel. Si personne dans l’équipe ne peut prendre en charge un cluster Kubernetes, n’en adoptez pas, quelle que soit l’allure du schéma d’architecture sur le papier.
  5. Frontières de sécurité. Des exigences réglementaires ou de conformité (données de paiement, dossiers médicaux) imposent parfois une frontière de service stricte, indépendamment de l’échelle, car l’isolation est le but même, pas un bonus.

La règle empirique qui mérite qu’on s’y tienne : commencer par un monolithe modulaire et n’extraire un service que lorsqu’un module précis doit monter en charge indépendamment, être livré à son propre rythme ou se placer derrière une frontière de sécurité plus stricte que le reste de l’application. Les principes de conception des applications web scalables reprennent le même arbitrage : les microservices réduisent le couplage, mais ajoutent une vraie charge d’orchestration et de supervision, qu’il faut bien payer d’une manière ou d’une autre.

Conseil de pro : Rédigez vos contrats d’API avant d’extraire un module dans son propre service, pas après. Les tests de contrat détectent tôt les ruptures de compatibilité et transforment le « on le séparera peut-être plus tard » en une option réelle et peu coûteuse.

Faire tourner le tout : observabilité et tests qui détectent vraiment les problèmes

Une architecture ne vaut que par votre capacité à voir quand elle casse. Trois catégories de télémétrie comptent : les logs (ce qui s’est passé), les métriques (combien et à quelle fréquence) et les traces (le chemin parcouru par une requête donnée à travers chaque service qu’elle a touché). Les métriques métier méritent elles aussi leur place à cette table. La disponibilité du serveur vous dit que le système tourne ; le taux de conversion ou de finalisation d’une commande vous dit qu’il fonctionne réellement.

Le traçage distribué, en particulier via le standard OpenTelemetry, est ce qui rend les microservices débogables tout court. Sans lui, un tunnel de commande lent qui traverse six services se transforme en six recherches de logs distinctes au lieu d’une trace unique montrant exactement où le temps est passé.

Côté tests, les tests de contrat vérifient que l’API d’un service correspond toujours à ce qu’attendent ses consommateurs, ce qui compte énormément une fois qu’un monolithe a été découpé en services déployés indépendamment. Associez-les à des tests d’intégration sur les flux critiques et à un runbook écrit pour vos trois principaux modes de défaillance, pour qu’un ingénieur d’astreinte n’improvise pas à 2 h du matin. Un modèle de santé simple, qui distingue « dégradé mais toujours en service » de « complètement à terre », garde des alertes utiles au lieu de bruyantes.

Comment Kreante aborde la planification d’une architecture d’application web

Kreante traite l’architecture comme une décision business avant d’être une décision technique. L’approche en trois piliers commence par le Consulting, qui cartographie les endroits où un choix d’architecture affecte réellement les résultats de l’entreprise, avant d’écrire la moindre ligne de code. Le Coaching s’assure ensuite que l’équipe saura exploiter ce qui aura été construit, pour que la capacité à faire évoluer et à maintenir le système reste en interne plutôt que de repartir avec un prestataire.

Le pilier Build est l’endroit où la philosophie du monolithe modulaire se concrétise : un prototype fonctionnel en quelques semaines avec les outils disponibles, validé face à un usage réel, puis une construction complète pour la production une fois que l’architecture a fait ses preuves face au trafic et aux besoins fonctionnels réels plutôt qu’à des suppositions. Sur plus de 265 projets dans 35 pays, cette séquence — prototyper d’abord, extraire et mettre à l’échelle ensuite — a systématiquement surpassé la conception pour une échelle hypothétique dès le premier jour. Les clients sont propriétaires de leur code, et un accompagnement continu est assuré après le lancement, ce qui compte car les décisions d’architecture prises tôt survivent rarement intactes au-delà de la première année.

Si votre équipe cadre un projet et souhaite une architecture alignée sur un objectif précis de revenus ou d’efficacité plutôt que sur une checklist générique de bonnes pratiques, les services de développement d’applications web et mobiles de Kreante partent de ce résultat et remontent jusqu’au système le plus simple qui permet de l’atteindre.

Pour aller plus loin sur l’architecture des applications web

Pour des détails de mise en œuvre concrets, au-delà de ce qu’un seul article peut couvrir, le guide de Microsoft Learn sur les architectures d’applications web courantes et la documentation de Google Cloud sur les applications scalables et résilientes sont les deux références fournisseurs les plus pratiques disponibles, aux côtés du guide de ByteByteGo sur l’architecture microservices pour le mode d’emploi de l’extraction. Pour les équipes qui évaluent spécifiquement les stacks low-code, l’analyse de Kreante sur les outils no-code et low-code pour créer des applications web est un bon complément.

L’avis de la rédaction : arrêtez de concevoir pour une échelle que vous n’avez pas encore

La plupart des équipes surdimensionnent leur première architecture parce qu’elles conçoivent pour le trafic qu’elles espèrent avoir, pas pour celui qu’elles ont vraiment. Ce réflexe est compréhensible et presque toujours erroné. Un monolithe modulaire avec de vraies frontières entre Auth, Billing et Search portera une équipe bien plus loin que la plupart des gens ne l’imaginent, et il pourra être découpé plus tard avec bien moins de douleur qu’une architecture microservices prématurée n’en cause dès le premier jour.

Modular monolith with bounded software modules

Le discours conventionnel survend les microservices comme un signe de maturité, comme si les adopter prouvait le sérieux de votre ingénierie. Cela prouve le contraire quand une équipe de cinq personnes assume la taxe opérationnelle d’un système distribué avant d’avoir le trafic ou les effectifs qui la justifient. Ce que les éléments réunis dans cet article soutiennent réellement est plus ennuyeux et plus utile : tracez dès le départ vos frontières de modules autour des capacités produit, instrumentez tout avec un vrai traçage, et n’extrayez un service que lorsqu’une pression précise et nommable (un goulot d’étranglement de mise à l’échelle, un conflit de cadence de livraison, une frontière de sécurité) vous y oblige.

Priorisez aujourd’hui les décisions de frontières. Le modèle de déploiement, le moteur de base de données, et même le framework, tout cela sera plus facile à changer plus tard qu’une base de code sans la moindre couture interne.


— Jorge Del Carpio

Sources

FAQ

L’architecture d’une application web est la conception structurelle qui définit comment le client, le serveur, les données et les composants d’infrastructure d’une application interagissent, du traitement des requêtes au stockage des données et au déploiement.

Les sept patterns courants sont le monolithe, le monolithe modulaire, l’architecture en couches (N-tier), l’architecture clean (hexagonale), les microservices, le serverless et l’architecture pilotée par les événements, chacun offrant un arbitrage différent entre vitesse de développement et complexité opérationnelle.

Une application web est construite à partir de cinq couches principales : le client, l’API/passerelle, la couche applicative (logique métier et workers d’arrière-plan), la couche de données (bases de données, réplicas, caches) et l’infrastructure de support comme les CDN, les répartiteurs de charge et les outils de supervision.

Au-delà des sept patterns principaux, les équipes combinent souvent plusieurs approches, comme un monolithe modulaire avec de la messagerie événementielle pour certains workflows, puisque la plupart des systèmes en production mélangent les patterns plutôt que d’en adopter un seul isolément.

Recommandé