Par Ahmed Karim NJIAWOUO GBETNKOM•5 min de lecture

Architecture Monolithique
On vous dira que le monolithique est mort. C'est faux. En 2026, 40% des nouveaux projets démarrent encore en monolithique. Pourquoi ? Parce que pour des MVPs, des startups en phase de validation, ou des équipes de 2-5 devs, c'est le choix le plus intelligent.
Structure type d'un monolithe
/mon-app
├── /src
│ ├── /controllers → Gestion des routes
│ ├── /models → Entités et logique métier
│ ├── /views → Templates (EJS, Pug)
│ ├── /routes → Définition des endpoints
│ └── /public → CSS, JS, images
├── /config → Variables d'environnement
├── server.js → Point d'entrée
└── package.json
Ce qui rend le monolithe fort :
- Simplicité brutale : Un seul codebase, un seul déploiement, une seule base de données. Pas de complexité distribuée.
- Vitesse de développement initiale : MVP en 2-4 semaines vs 2-3 mois pour des microservices.
- Debugging facile : Tout l'appel se fait dans un seul process. Pas de traçage distribué à gérer.
- Coût minimal : Un seul serveur pour démarrer. Pas de surcharge d'orchestration.
Les limites qui tuent : Scaling vertical uniquement (plus de RAM/CPU, pas plus de serveurs), déploiement all-or-nothing (une ligne qui casse = tout le site down), tech stack unique (PHP ou Node, pas les deux).
Qui l'utilise encore ? Basecamp (37signals) assume complètement le monolithe. Leur app tourne sur Rails monolithique. Leur argument : "Microservices pour quoi faire ? On scale très bien comme ça."
Microservices : la révolution qui coûte cher
Selon l'analyse de MRFR, le marché des microservices aurait pesé 9,126 milliards USD en 2025, avec une croissance folle de 18,52% par an. Mais attention : la complexité opérationnelle est réelle.
Structure type microservices
/projet
├── /auth-service → Authentification
│ ├── /src
│ ├── Dockerfile
│ └── package.json
├── /user-service → Gestion utilisateurs
├── /payment-service → Paiements
├── /notification-service → Emails/Push
├── /api-gateway → Point d'entrée unique
│ └── kong.yml ou ambassador.yml
├── /shared → Librairies partagées
└── docker-compose.yml
Pourquoi les microservices explosent :
- Scaling indépendant : Le service de paiement crashe sous la charge Black Friday ? Scalez juste celui-là, pas toute l'app.
- Polyglot : Auth en Node.js, analytics en Python, paiements en Go. Chaque équipe choisit sa stack.
- Déploiement continu : Équipe A déploie 10 fois par jour sans impacter l'équipe B.
- Isolation des pannes : Un service qui meurt ne tue pas tout le système (si bien fait).
Le prix à payer (et il est lourd) :
- Complexité réseau : Latence inter-services, gestion des timeouts, retries, circuit breakers...
- Observabilité cauchemardesque : Logs distribués, tracing (Jaeger, Zipkin), métriques par service...
- Data consistency : Transactions distribuées, eventual consistency, Saga pattern...
- Coût opérationnel : Kubernetes, service mesh (Istio), APM tools... Facture qui explose.
Cas réel : Netflix et ses 700+ microservices
Netflix a plus de 700 microservices en production. Chaque service gère une fonctionnalité spécifique : recommandations, streaming, billing, etc. Résultat : déploiements 4 000 fois par jour, résilience extrême (un service down ne tue pas le site), mais aussi une équipe de 200+ ingénieurs SRE pour gérer l'infrastructure.
Multi-tenant SaaS : l'architecture qui fait gagner de l'argent
Si vous construisez un SaaS, l'architecture multi-tenant n'est pas optionnelle. C'est LE modèle qui permet de scaler économiquement.
Le principe : une seule instance de votre application sert des centaines ou milliers de clients (tenants). Tous partagent la même infrastructure, mais leurs données sont isolées.
Les 3 niveaux d'isolation multi-tenant
1. Base de données partagée, schéma partagé : Tous les tenants dans
la même DB, même schéma. Column tenant_id
partout. Économique au max, mais risque de fuite de données si mal fait.
2. Base de données partagée, schémas séparés : Un schéma par tenant dans la même DB. Isolation moyenne, gestion complexe si 10 000+ tenants.
3. Bases de données séparées : Une DB par tenant. Isolation maximale, mais coût et complexité opérationnelle explosent. Réservé aux tenants premium/enterprise.
Statistiques qui tuent : Les déploiements multi-tenant automatisés réduisent le temps d'onboarding de 85-90% comparé aux processus manuels, tout en réduisant les erreurs de configuration de 75%.
Exemple : Isolation par tenant_id (approche 1)
// Middleware d'isolation
app.use((req, res, next) => {
const tenantId = req.headers['x-tenant-id'];
req.tenantId = tenantId;
next();
});
// Query automatiquement filtrée
const users = await db.users.findMany({
where: { tenant_id: req.tenantId }
});
Serverless
Serverless ne veut pas dire "sans serveur". Ça veut dire "je m'en fous du serveur, c'est AWS/Vercel/Netlify qui gère".
Structure type serverless
/serverless-app
├── /functions → Fonctions cloud
│ ├── getUsers.js → GET /api/users
│ ├── createOrder.js → POST /api/orders
│ └── sendEmail.js → Background job
├── /frontend → Site statique (Next.js)
├── serverless.yml → Config déploiement
└── package.json
Ce qui rend serverless incroyable :
- Zero ops : Pas de serveur à gérer, pas de scaling manuel, pas de monitoring infra.
- Pay-per-use : Vous payez à l'exécution. 0 requête = 0€. 1 million de requêtes = quelques dollars.
- Auto-scaling infini : De 0 à 100 000 requêtes/seconde automatiquement.
- Time to market : Déployez en 30 secondes avec
vercel deploy.
Les pièges (et ils sont sournois) :
- Cold starts : Première requête après inactivité = 1-3 secondes de latence
- Vendor lock-in : Migrer d'AWS Lambda vers Google Cloud Functions n'est pas trivial
- Debugging complexe : Pas de logs en temps réel, tout passe par CloudWatch/Vercel Logs
- Coût imprévisible : Si vous vous faites DDoS, la facture peut exploser
Event-Driven
Dans une architecture event-driven, les services ne se parlent pas directement. Ils émettent et écoutent des événements.
Structure type event-driven
/event-driven-app
├── /producers → Émetteurs d'événements
│ ├── order-service → Émet "OrderCreated"
│ └── payment-service → Émet "PaymentProcessed"
├── /consumers → Écouteurs
│ ├── email-service → Sur "OrderCreated" → Envoie email
│ ├── analytics-service → Log tous les events
│ └── inventory-service → Sur "OrderCreated" → Décrémente stock
├── /event-bus → RabbitMQ, Kafka, Redis Streams
└── docker-compose.yml
Pourquoi c'est puissant :
- Découplage total : Le service de commande ne sait même pas qu'il existe un service d'analytics. Il émet juste un event.
- Scalabilité naturelle : Ajoutez des consumers sans toucher aux producers.
- Temps réel : Parfait pour chat, notifications live, dashboards en temps réel.
- Résilience : Si un consumer tombe, les events sont stockés dans la queue. Rien n'est perdu.
Cas d'usage killer : E-commerce (commande → décrémente stock → envoie email → update analytics), IoT (capteurs → événements → traitement temps réel), systèmes bancaires (transaction → vérification fraud → notification).
JAMstack : le retour du statique (en mieux)
JAMstack = JavaScript + APIs + Markup. L'idée : générer du HTML statique à la build, servir depuis un CDN ultra rapide, utiliser des APIs pour la partie dynamique.
Structure JAMstack (Next.js static)
/jamstack-app
├── /src
│ ├── /components → React components
│ ├── /pages → Routes (SSG)
│ └── /styles → Tailwind CSS
├── /public
│ └── /static-assets → Images, fonts
├── next.config.js → output: 'export'
├── netlify.toml → Config déploiement
└── package.json
Les avantages fous :
- Performance brutale : HTML statique servi depuis un CDN = 20-50ms de TTFB. Imbattable.
- Sécurité by design : Pas de serveur = pas de surface d'attaque serveur. Pas d'injection SQL possible.
- Coût ridicule : Netlify/Vercel gratuit jusqu'à 100GB de bande passante. Cloudflare Pages illimité gratuit.
- Scaling automatique : CDN global = pas de scaling à gérer. 1 million de visiteurs ? Aucun problème.
Les limites : Pas adapté pour du temps réel (chat, dashboard live), rebuild complet à chaque modification de contenu (problème si 10 000+ pages), partie dynamique dépend d'APIs tierces.
Architecture hexagonale (Ports & Adapters) : la pureté architecturale
Aussi appelée "Clean Architecture" ou "Ports & Adapters", cette approche place la logique métier au centre, complètement isolée des détails techniques.
Structure hexagonale
/hexagonal-app
├── /src
│ ├── /domain → Logique métier PURE
│ │ ├── /entities → User, Order, Product
│ │ └── /use-cases → CreateOrder, ProcessPayment
│ ├── /ports → Interfaces (contrats)
│ │ ├── /input → HTTP, CLI, GraphQL
│ │ └── /output → Database, Email, Payment
│ └── /adapters → Implémentations
│ ├── /http → Express routes
│ ├── /database → Prisma, TypeORM
│ └── /payment → Stripe adapter
└── /tests → Tests unitaires domaine
Le principe clé : Votre logique métier ne doit JAMAIS dépendre d'un framework, d'une DB, ou d'une lib tierce. Elle définit des interfaces (ports), et les adapters implémentent ces interfaces.
Avantage énorme : Testabilité parfaite (logique métier testée sans DB ni réseau), flexibilité maximale (changer de Postgres à MongoDB = juste un nouvel adapter), longévité du code (la logique métier survit aux changements de stack).
Le prix : Beaucoup de code (interfaces, adapters), courbe d'apprentissage raide, over-engineering si votre app est simple.
BFF (Backend For Frontend) : un backend par client
Vous avez une app web, une app mobile iOS, une app mobile Android, et peut-être une app TV ? Le pattern BFF dit : créez un backend spécifique pour chaque type de client.
Structure BFF
/bff-app
├── /web-bff → Backend pour le web
│ ├── /src → Agrège user + orders + products
│ └── Dockerfile
├── /mobile-bff → Backend pour mobile
│ └── /src → Données minimales, optimisées
├── /tv-bff → Backend pour Smart TV
├── /shared-services → Services partagés
│ ├── /user-service
│ ├── /order-service
│ └── /product-service
└── docker-compose.yml
Pourquoi c'est intelligent :
- Optimisation par plateforme : Le mobile ne charge que ce dont il a besoin (économie data/batterie)
- Évolution indépendante : L'équipe web itère sans casser le mobile
- Format adapté : GraphQL pour le web, REST minimal pour le mobile
Qui l'utilise : Spotify (BFF web vs mobile vs desktop), Netflix (différents BFF par plateforme), SoundCloud.
Tableau comparatif : quelle architecture pour quel projet ?
| Architecture | Complexité | Coût | Scalabilité | Use case idéal |
|---|---|---|---|---|
| Monolithique | Faible | € | Limitée | MVP, startups, petits projets |
| Microservices | Très élevée | €€€€ | Excellente | Enterprise, scaling massif |
| Multi-tenant SaaS | Moyenne | €€ | Très bonne | SaaS B2B, plateformes |
| Serverless | Faible-Moyenne | €-€€€ | Infinie | APIs, JAMstack, trafic variable |
| Event-Driven | Élevée | €€€ | Excellente | Temps réel, IoT, e-commerce |
| JAMstack | Faible | € | Excellente | Sites statiques, blogs, docs |
| Hexagonale | Élevée | €€€ | Bonne | Logique métier complexe |
| BFF | Moyenne | €€ | Bonne | Apps multi-plateformes |
En 2026, il n'y a pas de solution unique. Le choix de l'architecture dépend de votre contexte : taille de l'équipe, budget, exigences de scalabilité, complexité métier. Le plus important est de comprendre les compromis de chaque approche et de choisir celle qui aligne le mieux avec vos objectifs business.

