Be Software Architecture Wise
Be Wise Apps

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.

Télécharger le chapitre (PDF)Lire dans l’application

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

5.1 · Intermédiaire · 22 minStyles et patronsLe vocabulaire des deux chapitres suivants : styles, patrons, tactiques et architectures de référence, partitionnement technique et partitionnement par domaine, déploiement monolithique et déploiement distribué, et le quantum d’architecture.Lire →5.2 · Intermédiaire · 24 minEn couchesLe style le plus familier : couches présentation, métier, persistance et base de données. Couches fermées et ouvertes, couches d’isolation, l’anti-patron du gouffre d’architecture, pourquoi chaque fonctionnalité touche toutes les couches, et comment faire respecter les règles.Lire →5.3 · Intermédiaire · 26 minMonolithe modulaireUne seule application déployable, divisée par domaine métier en modules dotés d’API explicites et de leurs propres données. Comment faire respecter les frontières, comment les modules communiquent, ce que Shopify en a appris et comment ce style préserve la possibilité d’extraire des services plus tard.Lire →5.4 · Intermédiaire · 23 minTubes et filtresDes données qui circulent à travers une chaîne d’étapes indépendantes : producteurs, transformateurs, testeurs et consommateurs reliés par des tubes. Des tubes Unix à l’ETL, aux compilateurs et au traitement de flux, avec le débit, la contre-pression et la gestion des erreurs.Lire →5.5 · Intermédiaire · 24 minMicronoyauComment un petit système central et des plug-ins indépendants apportent l’extensibilité : registres, contrats, isolation et versionnage, exemples réels tirés des IDE et des navigateurs, et un contrat de plug-in commenté pour des règles fiscales propres à chaque pays.Lire →5.6 · Intermédiaire · 25 minHexagonale et Clean ArchitecturePorts et adaptateurs, architecture en oignon et Clean Architecture : garder la logique métier au centre avec des dépendances orientées vers l’intérieur, ports pilotes et ports pilotés, un exemple en Python avec un véritable adaptateur et une doublure de test, et les coûts.Lire →5.7 · Intermédiaire · 26 minConception pilotée par le domaineTrouver les frontières dans le domaine métier : langage omniprésent, sous-domaines cœur, de soutien et génériques, contextes délimités, relations de la carte de contextes, event storming, agrégats, et une carte de contextes de la plateforme de livraison de repas.Lire →5.8 · Intermédiaire · 24 minChoisir un monolitheMonolithFirst, le surcoût des microservices et le monolithe majestueux ; quand une seule unité de déploiement est le bon choix, jusqu’où un monolithe peut passer à l’échelle, les signes qu’il est temps de le découper, et un guide de décision pour les styles du chapitre 5.Lire →

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’app

Lectures complémentaires