Read in English · Leer en español · Auf Deutsch lesen
Chapitre 5 sur 12 · Intermédiaire
Styles architecturaux I : monolithes et conceptions modulaires
La plupart des logiciels, y compris certains des produits les plus importants et qui connaissent le plus de succès, fonctionnent comme une seule application déployable. Ce chapitre explique comment de telles applications doivent être structurées à l’intérieur. Il présente le vocabulaire des styles architecturaux, des patrons, des tactiques et du quantum d’architecture, puis traite de l’architecture en couches, du monolithe modulaire, des tubes et filtres, de l’architecture micronoyau et à plug-ins, des architectures hexagonale, en oignon et Clean Architecture, et de la conception stratégique pilotée par le domaine, avant de se terminer sur les cas où un monolithe est la bonne réponse. Il s’adresse aux développeurs et aux architectes qui conçoivent ou maintiennent des applications métier et qui veulent choisir et faire respecter une structure de façon délibérée.
Introduction vidéo au chapitre 5
6 min · narré en anglais, avec sous-titresÉcouter seulement (audio)
Lire la transcription
Bienvenue dans le chapitre 5 : Styles architecturaux, première partie, monolithes et conceptions modulaires. La plupart des logiciels, y compris certains des produits les plus importants et qui connaissent le plus de succès, fonctionnent comme une seule application déployable. Ce chapitre explique comment de telles applications doivent être structurées à l’intérieur, et quand une application unique est la bonne réponse.
Les chapitres 3 et 4 vous ont donné les principes d’une bonne structure, et les outils pour la décrire. Ce chapitre et le suivant transforment ces principes en formes récurrentes que prennent les systèmes réels. Connaître les principaux styles vous permet de partir d’une forme dont on sait qu’elle fonctionne pour un ensemble donné de qualités, de l’expliquer en une phrase et de repérer tôt le moment où un système s’en écarte. Ce chapitre traite des styles où l’application entière est une seule unité de déploiement : un seul build, une seule mise en production, généralement une seule base de données. Cela ne fait pas des monolithes des systèmes primitifs. Qu’un monolithe soit un plaisir ou un calvaire à faire évoluer dépend presque entièrement de la façon dont il est découpé à l’intérieur.
Le chapitre s’adresse aux développeurs et aux architectes qui conçoivent ou maintiennent des applications métier, et qui veulent choisir et faire respecter une structure de façon délibérée. Il s’appuie sur les chapitres 3 et 4, en particulier la modularité, le couplage et la cohésion, les dépendances et l’organisation en couches, et le modèle C4. Les attributs de qualité du chapitre 2 sont utilisés tout au long du chapitre. Et il mène au chapitre 6, qui pose les mêmes questions à travers un réseau, là où les choses se compliquent. Un monolithe évite les pannes réseau, les indisponibilités partielles et les problèmes de cohérence des systèmes distribués. Le chapitre 6 s’y attaque.
D’abord, une définition. Un style architectural est un ensemble nommé de contraintes portant sur les types de parties d’un système, et sur la façon dont elles peuvent se connecter. Les contraintes sont l’essentiel. Interdisez par exemple à un module métier de toucher aux tables d’un autre, et vous obtenez des avantages prévisibles, à un prix prévisible.
Le chapitre compte huit sections. La section cinq point un pose le vocabulaire utilisé pour chaque style des chapitres 5 et 6 : styles, patrons, tactiques et architectures de référence. Elle explique la différence entre le partitionnement technique, par couche, et le partitionnement par domaine, par capacité métier. Et elle présente le quantum d’architecture : une partie déployable indépendamment, données comprises, à laquelle s’applique un seul ensemble de qualités.
Voici pourquoi le partitionnement compte. Supposons qu’une entreprise de livraison de repas permette aux clients d’ajouter un pourboire pour le livreur. Avec un partitionnement technique, ce seul changement touche la couche de présentation, la logique métier et la couche de persistance. Avec un partitionnement par domaine, le même changement se concentre presque entièrement dans le module de livraison, qui peut lui-même rester organisé en couches à l’intérieur. La plupart des demandes de changement métier sont formulées en termes de domaine, si bien que le partitionnement par domaine tend à garder un changement au même endroit. Et il permet à chaque équipe de prendre en charge une capacité métier de bout en bout.
Les sections cinq point deux à cinq point cinq décrivent quatre styles selon le même format, avec un diagramme, un exemple, un tableau des caractéristiques, quand l’utiliser et comment le faire respecter dans le code. L’architecture en couches est l’empilement familier des couches de présentation, métier et persistance. Le monolithe modulaire découpe une application déployable unique par domaine métier, avec des interfaces de modules explicites et une propriété claire des données, illustré par l’expérience de Shopify. Le style tubes et filtres organise le traitement en une chaîne d’étapes indépendantes, des tubes Unix aux pipelines de données. Et le micronoyau construit un noyau minimal que des plug-ins étendent, comme dans les outils de développement, les navigateurs et les moteurs de règles.
Ce diagramme de la section cinq point trois montre l’intérieur d’un monolithe modulaire. La frontière en pointillés est une seule unité de déploiement : l’application de livraison de repas. Chaque module, ici Commandes et Paiements, possède une petite API publique. Commandes ne peut utiliser Paiements qu’en appelant cette API. Tout le reste d’un module est interne. Aller chercher dans les éléments internes d’un autre module depuis ceux d’un module est interdit. Et chaque module possède son propre schéma, sans jointures entre schémas. Respectez ces règles, et n’importe quel module pourra plus tard être extrait en service avec un effort modeste.
La section cinq point six traite des architectures hexagonale, en oignon et Clean Architecture. Elles placent la logique métier au centre, et font dépendre d’elle les bases de données, les interfaces utilisateur et les services externes, jamais l’inverse. La section cinq point sept, sur la conception stratégique pilotée par le domaine, fournit la méthode pour trouver de bonnes frontières : sous-domaines, contextes délimités, et relations entre eux dans une carte de contextes. Enfin, la section cinq point huit se demande quand un monolithe est la bonne réponse, jusqu’où il peut passer à l’échelle, et quels signes indiquent qu’il est temps de le découper. Elle se termine par un guide de décision et un tableau comparatif de tous les styles du chapitre.
Si vous ne deviez retenir qu’une chose, ce serait celle-ci : les frontières à l’intérieur d’un système comptent plus que les frontières entre unités de déploiement. Un ensemble de services qui partagent une base de données et appellent les éléments internes les uns des autres reste un seul système enchevêtré, avec en plus les pannes réseau. Deux habitudes en découlent. D’abord, choisissez le style le plus simple dont les caractéristiques satisfont les exigences architecturalement significatives du système, et consignez ce choix et ses compromis dans un enregistrement de décision. Ensuite, faites respecter les règles du style avec des tests d’architecture dans le build, car tout style s’érode lorsque ses contraintes n’existent que dans la tête des gens.
Lisez d’abord la section cinq point un, car toutes les sections suivantes utilisent son vocabulaire. Ensuite, vous pouvez parcourir les styles dans l’ordre ou piocher dans celui dont vous avez besoin. La lecture du chapitre prend environ trois heures. Suivez la plateforme de livraison de repas tout au long du chapitre. Comparer les styles sur un seul système familier est bien plus facile que sur des exemples jouets sans rapport entre eux. Chaque section se termine par quelques questions d’autoévaluation. Répondez-y de tête avant de regarder. Quand vous êtes prêt, passez le test facultatif du chapitre : vingt questions à choix multiples et deux réponses rédigées, en quarante-cinq minutes environ. La note de réussite est de quatre-vingts pour cent.
Voilà la carte du chapitre 5. Commencez par la section cinq point un, où nous posons le vocabulaire des styles, des patrons et des tactiques sur lequel s’appuient les deux chapitres suivants. À très vite.
En un coup d’œil
Vous apprendrez à
- Distinguer les styles architecturaux, les patrons, les tactiques et les architectures de référence, et expliquer pourquoi les contraintes d’un style produisent ses qualités.
- Comparer le partitionnement technique et le partitionnement par domaine, et prévoir l’effet de chacun sur le coût d’un changement typique et sur l’organisation des équipes.
- Identifier les quanta d’architecture d’une conception et expliquer pourquoi des bases de données partagées lient des services en un seul quantum.
- Décrire les styles en couches, monolithe modulaire, tubes et filtres et micronoyau, évaluer leurs caractéristiques et reconnaître leurs anti-patrons.
- Appliquer l’architecture hexagonale, en oignon ou Clean Architecture pour garder la logique métier indépendante des frameworks et de l’infrastructure.
- Utiliser la conception stratégique pilotée par le domaine pour trouver des contextes délimités et décrire leurs relations dans une carte de contextes.
- Faire respecter des règles structurelles dans le code avec des tests d’architecture et des outils de modules comme import-linter, ArchUnit et Spring Modulith.
- Décider quand un monolithe est le bon choix, comment le faire passer à l’échelle et quels signes indiquent qu’il est temps d’en extraire des services.
Avant de commencer
Le chapitre 3, en particulier la modularité, le couplage et la cohésion, ainsi que les dépendances et l’organisation en couches ; le chapitre 4, en particulier le modèle C4. Les attributs de qualité du chapitre 2 sont utilisés tout au long du chapitre.
Durée
Environ 3 heures de lecture ; 45 minutes pour le test.
Termes clés
style architectural · patron architectural · tactique · partitionnement technique · partitionnement par domaine · quantum d’architecture · couches fermées et ouvertes · gouffre d’architecture (architecture sinkhole) · monolithe modulaire · tubes et filtres · back pressure (contre-pression) · micronoyau · ports et adaptateurs · contexte délimité
Pourquoi les styles comptent
Les chapitres 3 et 4 vous ont donné les principes d’une bonne structure (modularité, couplage et cohésion, sens des dépendances) et les outils pour la décrire. Ce chapitre et le suivant transforment ces principes en formes récurrentes que prennent les systèmes réels. Un style architectural est un ensemble nommé de contraintes portant sur les types de parties d’un système et sur la façon dont elles peuvent se connecter. Les contraintes sont l’essentiel : interdisez aux parties d’un pipeline de partager un état, ou interdisez à un module métier de toucher aux tables d’un autre, et vous obtenez des avantages prévisibles, à un prix prévisible. Connaître les principaux styles permet à un architecte de partir d’une forme dont on sait qu’elle fonctionne pour un ensemble donné de qualités, de l’expliquer en une phrase et de repérer tôt le moment où un système s’en écarte.
Ce chapitre traite des styles dans lesquels l’application entière est une seule unité de déploiement : un seul build, une seule mise en production, généralement une seule base de données, avec des parties qui s’appellent les unes les autres en mémoire. Une telle architecture monolithique évite les pannes réseau, les indisponibilités partielles et les problèmes de cohérence des systèmes distribués, que le chapitre 6 aborde. Cela ne fait pas des monolithes des systèmes primitifs. Qu’un monolithe soit un plaisir ou un calvaire à faire évoluer dépend presque entièrement de la façon dont il est découpé à l’intérieur, et c’est le sujet de ce chapitre.
Comment s’articule le chapitre
La section 5.1 pose le vocabulaire utilisé pour chaque style des chapitres 5 et 6 : styles, patrons, tactiques et architectures de référence ; la différence entre le partitionnement technique (par couche) et le partitionnement par domaine (par capacité métier) ; le déploiement monolithique et le déploiement distribué ; et le quantum d’architecture, l’unité déployable indépendamment à laquelle s’applique un seul ensemble de qualités. Elle se termine par un tableau récapitulatif de tous les styles des deux chapitres.
Les sections 5.2 à 5.5 décrivent ensuite quatre styles selon un format homogène : définition et origine, un diagramme, le fonctionnement, un exemple, un tableau des caractéristiques, quand l’utiliser et quand l’éviter, les anti-patrons et la manière de le faire respecter dans le code. L’architecture en couches (5.2) est l’empilement familier présentation, métier et persistance, avec ses couches fermées et ouvertes et l’anti-patron du gouffre. Le monolithe modulaire (5.3) découpe une application déployable unique par domaine métier, avec des API de modules explicites et une propriété claire des données, illustré par l’expérience de Shopify et par une carte des modules d’une plateforme de livraison de repas. Le style tubes et filtres (5.4) organise le traitement en une chaîne d’étapes indépendantes, des tubes Unix aux pipelines de données. Le micronoyau (5.5) construit un noyau minimal que des plug-ins étendent, comme dans les IDE, les navigateurs et les moteurs de règles.
Les sections 5.6 et 5.7 portent sur la structure à l’intérieur des modules et entre eux plutôt que sur le déploiement. Les architectures hexagonale, en oignon et Clean Architecture (5.6) placent la logique métier au centre et font dépendre d’elle les bases de données, les interfaces utilisateur et les services externes, jamais l’inverse, ce qui rend le cœur testable et son infrastructure remplaçable. La conception stratégique pilotée par le domaine (5.7) fournit la méthode pour trouver de bonnes frontières : sous-domaines, contextes délimités et relations entre eux dans une carte de contextes. Enfin, la section 5.8 se demande quand un monolithe est la bonne réponse, jusqu’où il peut passer à l’échelle et quels signes indiquent qu’il est temps de le découper, et propose un guide de décision et un tableau comparatif des styles du chapitre.
Un exemple fil rouge
Comme dans les chapitres précédents, une plateforme de livraison de repas revient tout au long du chapitre : les clients commandent auprès de restaurants, des livreurs livrent, les paiements passent par un prestataire externe. Dans la section 5.1, elle est classée selon quatre conceptions candidates ; en 5.2, c’est une application web classique en couches ; en 5.3, elle devient huit modules avec une règle de dépendance vérifiée dans le build ; en 5.4, ses événements de commande traversent un pipeline jusqu’à un entrepôt de données, et trouver le goulet d’étranglement fait l’objet d’un calcul commenté. Les sections suivantes reviennent à la même plateforme, de la façon la plus complète dans la carte de contextes de la section 5.7, afin que les styles puissent être comparés sur un seul système familier plutôt que sur des exemples jouets sans rapport entre eux.
L’idée à retenir
Si vous ne deviez retenir qu’une chose de ce chapitre, ce serait celle-ci : les frontières à l’intérieur d’un système comptent plus que les frontières entre unités de déploiement. Un monolithe découpé par domaine, avec des API de modules explicites, un seul propriétaire pour chaque table et des règles de dépendance vérifiées automatiquement, peut être modifié en toute sécurité par plusieurs équipes pendant de nombreuses années, et n’importe quel module pourra plus tard devenir un service s’il en a vraiment besoin. Un ensemble de services qui partagent une base de données et appellent les éléments internes les uns des autres reste un seul système enchevêtré, avec en plus les pannes réseau. Les styles sont des outils pour créer et préserver de bonnes frontières ; aucun d’eux n’est une fin en soi.
Deux habitudes en découlent. D’abord, choisissez le style le plus simple dont les caractéristiques satisfont les exigences architecturalement significatives du système, et consignez ce choix et ses compromis dans un enregistrement de décision. Ensuite, faites respecter les règles du style avec des tests d’architecture dans le build, car tout style s’érode lorsque ses contraintes n’existent que dans la tête des gens.
Les 8 sections
Test du chapitre
Vérifiez votre compréhension du chapitre 5
Facultatif : 20 questions à choix multiples et 2 courtes réponses rédigées, tirées à chaque fois d’une banque de 72 questions. Note de réussite : 80 %. Réussir tous les tests de chapitre, puis l’évaluation finale, donne droit au Certificat de fin de formation Be Wise.
Passer le test du chapitre 5 dans l’appLectures complémentaires
- Fundamentals of Software Architecture (2nd edition), Mark Richards and Neal Ford (2025), O'Reilly Media. Un chapitre par style, dont les styles en couches, monolithe modulaire, pipeline et micronoyau, chacun avec une évaluation des caractéristiques ; le modèle des comparaisons de ce chapitre.
- Pattern-Oriented Software Architecture, Volume 1: A System of Patterns, Frank Buschmann, Regine Meunier, Hans Rohnert, Peter Sommerlad and Michael Stal (1996), John Wiley and Sons. Le catalogue classique des patrons architecturaux, dont Couches (Layers), Tubes et filtres (Pipes and Filters) et Micronoyau (Microkernel), chacun avec son contexte, ses forces et ses conséquences.
- An Introduction to Software Architecture, David Garlan and Mary Shaw (1994), Carnegie Mellon University, Software Engineering Institute (CMU/SEI-94-TR-021). Le court article qui a défini les styles architecturaux comme des composants, des connecteurs et des contraintes, avec les tubes et filtres et les systèmes en couches parmi ses exemples.
- Software Architecture: The Hard Parts, Neal Ford, Mark Richards, Pramod Sadalage and Zhamak Dehghani (2021), O'Reilly Media. Développe le quantum d’architecture et l’analyse du couplage et de la propriété des données qui détermine où un système peut être découpé.
- Monolith to Microservices, Sam Newman (2019), O'Reilly Media. Un guide équilibré sur le moment, l’opportunité et la manière de décomposer un monolithe, avec un solide plaidoyer en faveur du monolithe modulaire.
- Domain-Driven Design: Tackling Complexity in the Heart of Software, Eric Evans (2003), Addison-Wesley. L’origine des contextes délimités, des cartes de contextes et du langage omniprésent, utilisés pour trouver les frontières des modules et des services.
- Hexagonal Architecture, Alistair Cockburn (2005), alistair.cockburn.us. La description originale des ports et adaptateurs, courte et toujours l’énoncé le plus clair de l’idée.
- Deconstructing the Monolith: Designing Software that Maximizes Developer Productivity, Kirsten Westeinde (2019), Shopify Engineering. Un récit de première main de la transformation d’une très grande application Rails en monolithe modulaire plutôt qu’en microservices.