Le choix entre monolithe modulaire et microservices est souvent présenté comme une opposition entre simplicité et passage à l’échelle. Cette lecture est trop courte. Les deux approches peuvent soutenir un produit ambitieux, et les deux peuvent devenir difficiles à maintenir lorsque les frontières métier sont floues ou que les pratiques d’exploitation ne suivent pas.
La bonne décision dépend surtout des changements que l’organisation doit rendre indépendants. Elle concerne le code, mais aussi les données, les déploiements, les responsabilités et la capacité à diagnostiquer une panne. Examiner ces dimensions avant de découper permet d’éviter une architecture distribuée qui ne ferait que déplacer les dépendances.
Comprendre ce que chaque option implique
Un monolithe modulaire est livré comme une unité, tout en organisant son code en modules dotés de frontières explicites. Chaque module porte une partie du métier et communique avec les autres par des interfaces contrôlées. Il conserve la simplicité d’un processus et d’un déploiement commun sans autoriser pour autant les accès arbitraires entre toutes les couches.
Les microservices ajoutent une isolation d’exécution et, idéalement, de données. Chaque service peut être déployé et dimensionné séparément, mais cette autonomie exige des contrats réseau, une gestion des pannes partielles et une plateforme d’exploitation cohérente. Un découpage en dépôts ou en conteneurs ne suffit pas si toutes les modifications doivent encore être coordonnées.
Commencer par les frontières du domaine
Une frontière pertinente regroupe les règles et les données qui changent ensemble. La facturation, le catalogue ou la gestion des droits peuvent former des domaines distincts si leur vocabulaire, leurs cycles et leurs responsables diffèrent réellement. Le découpage par couche technique, avec un service pour les contrôleurs et un autre pour les données, augmente au contraire les appels sans créer d’autonomie.
Avant toute séparation physique, les dépendances doivent être visibles dans le code. Un module ne devrait pas lire directement les tables privées d’un autre ni importer ses classes internes. Des interfaces et des événements internes permettent d’éprouver les limites à faible coût. Si elles évoluent constamment, les transformer trop tôt en appels réseau rendra seulement cette instabilité plus chère.
- Repérer les règles qui doivent rester cohérentes dans une même opération.
- Regrouper ce qui change pour les mêmes raisons.
- Nommer un responsable métier et technique pour chaque frontière.
Évaluer le besoin réel d’autonomie
Les microservices sont utiles lorsqu’une équipe doit livrer une capacité sans attendre le calendrier des autres, ou lorsqu’une charge très spécifique justifie un dimensionnement isolé. Ils peuvent aussi limiter l’impact d’un composant à risque. Ces bénéfices apparaissent toutefois uniquement si les équipes possèdent effectivement leurs services, de la conception jusqu’au support en production.
Si les mêmes personnes interviennent partout, si chaque fonctionnalité traverse la majorité des composants ou si les déploiements restent groupés, la distribution apporte peu d’indépendance. Un monolithe modulaire offre alors des boucles de développement plus courtes, des tests locaux plus simples et des transactions directes, tout en préparant un éventuel découpage futur.
Intégrer le coût d’exploitation dans la décision
Chaque service ajoute un artefact à construire, configurer, sécuriser, observer et maintenir. Il faut propager le contexte de traçage, gérer les secrets, centraliser les journaux et standardiser les déploiements. Sans automatisation, cette charge détourne les équipes du produit et crée des différences de configuration difficiles à diagnostiquer.
Les pannes changent aussi de nature. Un appel local devient une communication susceptible d’expirer, d’être répétée ou d’arriver dans le désordre. Les équipes doivent savoir choisir les délais d’attente, mettre en œuvre l’idempotence et raisonner sur la cohérence éventuelle. Ces compétences sont un prérequis opérationnel, pas une tâche à reporter après la migration.
- Vérifier que les alertes et tableaux de bord sont standardisés.
- Automatiser la création, le déploiement et la mise à jour d’un service.
- Prévoir une astreinte et des procédures adaptées aux pannes distribuées.
Comparer les contraintes de données
Dans un monolithe, une transaction peut protéger simplement plusieurs changements liés. Cela ne dispense pas de définir la propriété des données, mais facilite les règles fortement cohérentes. Dans une architecture de microservices, partager une base annule une grande partie de l’autonomie : une migration de schéma ou une requête transversale peut toujours bloquer plusieurs équipes.
Séparer les données oblige à concevoir des échanges et parfois des copies locales. Les vues globales passent par une composition d’API, un flux d’événements ou un modèle de lecture dédié. Il faut alors assumer qu’une information puisse être temporairement décalée et définir le comportement utilisateur correspondant, plutôt que de promettre une cohérence que le système ne garantit pas.
Adopter une trajectoire réversible
Le choix n’a pas besoin d’être définitif. Une équipe peut démarrer avec un monolithe modulaire, mesurer ses points de contention puis extraire un domaine lorsque le bénéfice devient observable. L’extraction est plus sûre si le module possède déjà son interface, ses tests, ses données clairement identifiées et peu de dépendances entrantes.
À l’inverse, des services trop fins peuvent être regroupés lorsqu’ils changent toujours ensemble. La réversibilité demande de documenter la raison de chaque séparation et les critères de succès attendus. Une décision d’architecture devient ainsi une hypothèse vérifiable plutôt qu’un engagement identitaire difficile à remettre en cause.
- Noter le problème concret que le découpage doit résoudre.
- Mesurer les coordinations de livraison et les incidents avant et après.
- Extraire d’abord un domaine bien compris et faiblement couplé.
En conclusion
Le monolithe modulaire constitue souvent une base robuste lorsque le domaine évolue encore ou que la capacité d’exploitation distribuée est limitée. Les microservices deviennent pertinents quand des frontières stables rencontrent un besoin démontré d’autonomie, d’isolation ou de dimensionnement différencié.
La qualité du découpage compte davantage que le nombre de processus. En rendant les dépendances explicites, en protégeant la propriété des données et en évaluant les coûts complets, une équipe peut choisir l’architecture qui soutient son travail actuel tout en conservant une voie d’évolution crédible.