Le diagramme de conteneurs C4
Le niveau 2 du modèle C4, tracé de bout en bout - et le seul niveau dont le nom sème plus de confusion que le diagramme lui-même.
6 min de lectureC4 model2 sur 3
La réponse courte
- Un conteneur est tout ce qui se déploie ou s'exécute séparément : une application, une API, une base de données, un courtier. Pas un conteneur Docker.
- Chaque boîte reçoit sa technologie et chaque trait son protocole. Un diagramme de conteneurs sans cela est un croquis de boîtes et de flèches.
- Tracez la flèche dans le sens de l'appel, pas dans celui des données. La réponse est implicite et la dessiner double les traits pour rien.
- Les systèmes externes restent sur le diagramme mais hors de la frontière, en gris : ils expliquent les bords sans faire croire que vous les contrôlez.
01Un système, ouvert#
Un diagramme de conteneurs prend la boîte unique du diagramme de contexte système et l'ouvre. Tout ce qui est dedans est quelque chose qui doit tourner ; tout ce qui est dehors reste du contexte.
Lisez-le comme une suite de phrases : le client parcourt l'application monopage ; l'application appelle la Storefront API en HTTPS ; l'API écrit les commandes dans PostgreSQL et publie vers RabbitMQ ; le worker consomme depuis RabbitMQ et écrit dans la même base. C'est cette dernière phrase que le diagramme de conteneurs existe pour rendre visible : deux conteneurs qui écrivent dans une même base sont un couplage qu'aucun catalogue de services ne montre.
02La technologie sur la boîte, le protocole sur le trait#
Ce sont ces deux étiquettes qui séparent un diagramme de conteneurs d'un croquis. Sans la technologie, une boîte nommée "Storefront API" pourrait être une Lambda, un monolithe Rails ou une procédure stockée. Sans le protocole, un trait entre deux boîtes pourrait être un appel synchrone dans le chemin de la requête ou un traitement par lots nocturne : deux faits opposés pour qui raisonne sur les pannes.
Tracez la flèche dans le sens de l'appel, pas dans celui des données. Une lecture reste un appel du lecteur vers le magasin, et dessiner la réponse comme une deuxième flèche double le nombre de traits sans rien apporter : la réponse est impliquée par la requête.
03Les quatre qui le rendent inutile#
Omettre les magasins de données. Un diagramme de services sans bases de données cache exactement le couplage qui provoque les incidents. Si deux conteneurs écrivent dans la même table, cela doit figurer sur l'image.
Mélanger les niveaux. Un diagramme de conteneurs dont un conteneur est ouvert sur ses classes internes, ce sont deux diagrammes mal superposés. Ouvrez-le plutôt sur un diagramme de composants, où le public attend cette profondeur.
Dessiner l'infrastructure. Répartiteurs de charge, sidecars et noeuds Kubernetes ont leur place sur un diagramme de déploiement. Un diagramme de conteneurs parle de ce qu'est le logiciel, pas d'où il tourne.
Faire disparaître discrètement les systèmes externes. Le prestataire de paiement n'est pas le vôtre et ne peut pas être omis pour autant : c'est de là que viennent votre latence et la moitié de vos modes de défaillance. Gardez-le, marquez-le externe, et arrêtez-vous là.
En une ligne chacun
- 01Un conteneur se déploie ou s'exécute séparément : application, API, base de données, courtier, tâche.
- 02Étiquetez chaque boîte par sa technologie et chaque trait par son protocole, sinon le diagramme ne dit rien.
- 03Les flèches suivent les appels, pas les données. La réponse est implicite.
- 04Magasins de données et systèmes externes restent sur le diagramme ; l'infrastructure part sur un diagramme de déploiement.
04Questions fréquentes#
Qu'est-ce qui compte comme conteneur en C4 ?
Tout ce qui doit tourner pour que le système fonctionne et qui peut être déployé ou démarré séparément : une application web, une application monopage, une application mobile, une API, une base de données, un broker de messages, une tâche planifiée. Le critère est la déployabilité, ni le nombre de processus ni la technologie.
Un conteneur Docker est-il un conteneur C4 ?
Pas nécessairement. Les noms se télescopent et désignent des choses différentes. Trois processus dans une même image font trois conteneurs C4 si l'équipe les raisonne séparément ; un service tournant sur quarante réplicas est un seul conteneur C4. Ignorez l'empaquetage et demandez ce qui est déployable séparément.
Chaque microservice doit-il être un conteneur ?
Oui, et c'est la raison honnête pour laquelle les diagrammes de conteneurs grossissent. Si quarante services rendent le diagramme illisible, c'est une information sur l'architecture et non sur la notation - regroupez-les par contexte borné et dessinez les groupes, ou faites un diagramme par contexte.
Où placer les files d'attente et les bases de données ?
Sur le diagramme, comme conteneurs, avec leur technologie étiquetée. Omettre la base de données est la façon la plus courante de rendre un diagramme de conteneurs trompeur : cela masque le couplage entre les deux services qui y écrivent tous les deux.
Dans cette série
- 01Qu'est-ce que C4 ?
- 02Diagramme de conteneurs
- 03C4 vs UML
À lire aussi
Fondamentaux
Pratique de la modélisation
Diagrammes de structure
Pratique de la modélisation