Révision Glossaire EN

Taille

Yeux

Termine une partie dans un dojo pour débloquer les yeux suivants.

Glossaire

Action de compensation
Une nouvelle action qui annule l’effet d’une précédente : libérer le stock, rembourser la carte. Elle diffère d’un rollback, car d’autres services ont peut-être déjà vu la première étape.
Outbox et sagas : quand un changement touche deux systèmes
Adaptateur
Le code qui implémente un port pour une technologie donnée : disque local, S3, Google Cloud Storage. L’adaptateur dépend du port, et le cœur ne sait pas quels adaptateurs existent.
Ports et adaptateurs : un seul cœur, plusieurs backends
Adapter
Adaptateur : une enveloppe qui fait rentrer un objet dans une interface pour laquelle il n’a pas été écrit. Un decorator garde l’interface et ajoute du comportement ; un adapter change l’interface.
Design patterns : des formes nommées que tu utilises déjà
ADR
Architecture Decision Record (registre de décision d’architecture) : un fichier court avec Titre, Statut, Contexte, Décision et Conséquences (Michael Nygard, 2011).
Les ADR : écrire le pourquoi d’une décision
Aggregate
Agrégat : un groupe d’objets modifiés comme une seule unité, à travers une seule racine. Ses invariants, les règles qui doivent toujours tenir, sont vérifiés à l’intérieur.
Les briques du DDD : à l’intérieur d’un bounded context
Alerte sur symptôme
Réveille un humain quand les utilisateurs souffrent (erreurs, lenteur), pas quand une cause pourrait les faire souffrir plus tard (CPU à 80 %).
Observabilité : logs, métriques, traces
Allowlist
Une règle qui interdit tout sauf ce qu’elle nomme. Les exceptions connues sont listées une par une, donc une nouvelle violation ne peut pas passer inaperçue.
Fitness functions : des décisions qui se vérifient toutes seules
Altitude
La quantité de détail dont un public a besoin pour agir sur une décision.
Une décision, trois publics
Anti-corruption layer
Couche anti-corruption : une couche de traduction dans le contexte en aval, qui réécrit le modèle de l’amont avec ses propres termes. Le reste de son code ne voit jamais les mots étrangers.
Bounded contexts et context maps
Appel synchrone
L’appelant attend la réponse. Il obtient le résultat, ou l’erreur, tout de suite.
Appels synchrones ou jobs asynchrones
Architect Elevator
L’image de Hohpe : l’architecte fait l’ascenseur entre la salle des machines de l’IT et le penthouse de la direction, et garde les deux connectés.
Une décision, trois publics
Architecture
Les décisions difficiles à changer plus tard et qui façonnent tout le reste : comment le système est découpé, où vit l’état, comment les parties se parlent.
L’architecture logicielle : les décisions coûteuses à changer
Architecture transitoire
Du code qui fait tourner l’ancien et le nouveau côte à côte, et que tu prévois de supprimer. Fowler : « du code qui disparaîtra une fois la modernisation terminée ».
Faire évoluer un système en marche sans l’arrêter
At-least-once
Au moins une fois : un message n’est jamais perdu une fois que le broker l’a accepté, mais peut arriver deux fois. Le consommateur ne confirme qu’une fois le travail fait, et dédoublonne.
Messaging : files, garanties de livraison et dead letters
Authentification
Vérifier qui est l’appelant : un mot de passe une fois, puis un token à chaque requête.
Gateways, tokens et SSO
Autorisation
Décider ce que cet appelant peut faire sur ces données. Il faut les règles des données, donc c’est le propriétaire des données qui le fait.
Gateways, tokens et SSO
Backfill
Remplir la nouvelle forme pour les lignes écrites avant qu’elle existe. Dans la migration, en tâche de fond par lots, ou pas du tout si le code lit « vide » sans danger.
Migrations de schéma et de données
Bounded context
Bounded context (contexte délimité) : une frontière à l’intérieur de laquelle chaque terme a exactement un sens. Souvent un service ou une équipe.
Bounded contexts et context maps
Bulkhead (cloison)
Des pools, des files ou des limites séparés par type de travail, pour qu’un type puisse saturer sans affamer les autres. Le nom vient des cloisons étanches dans la coque d’un navire.
Résilience : empêcher une panne de se propager
C4
Quatre niveaux de zoom pour les diagrammes : Contexte, Conteneurs, Composants, Code. Tu dessines rarement le quatrième.
Le diagramme de contexte : ton système en une seule boîte
Câblage
L’unique endroit qui choisit un adaptateur et le donne au cœur. Pour changer de backend, tu changes le choix à cet endroit.
Ports et adaptateurs : un seul cœur, plusieurs backends
Caractéristique
Une qualité que le système doit avoir et qui n’est pas une fonctionnalité : latence, débit, disponibilité, sécurité… On parle souvent d’une « -ilité ».
Les caractéristiques d’architecture : choisir les trois principales
Chain of responsibility
Chaîne de responsabilité : une requête traverse une liste de handlers dans l’ordre. Chacun peut la modifier, la passer au suivant, ou l’arrêter.
Design patterns : des formes nommées que tu utilises déjà
Changement rétrocompatible
Les anciens consommateurs continuent de marcher sans rien changer de leur côté : un nouvel endpoint, un nouveau champ optionnel. Supprimer, renommer ou changer le type d’un champ, ou lui donner un nouveau sens, est un changement cassant.
Conception et versionnement d’API
Circuit breaker
Après trop d’échecs, arrête d’appeler une dépendance pendant un moment et échoue tout de suite. Puis laisse passer quelques appels d’essai pour voir si elle s’est rétablie.
Résilience : empêcher une panne de se propager
Clé d’idempotence
Une valeur unique que le client envoie avec une requête, et renvoie à chaque retry de cette requête, pour que le serveur repère la répétition.
L’échec : timeouts, retries, idempotence
Clé de partition
Le champ qui décide dans quelle partition va une ligne. Une requête qui la nomme lit une seule partition. Une requête qui ne la nomme pas doit les interroger toutes.
Faire grandir les données
Cœur (core)
Ce qui te distingue de tes concurrents. C’est complexe et ça change souvent, donc tu le construis en interne avec tes meilleurs éléments.
Sous-domaines cœur, support et générique
Cohésion
À quel point les parties d’un module servent le même travail. Cohésion faible : un module qui fait deux choses sans rapport.
Couplage et cohésion dans un service de checkout
Competing consumers
Plusieurs consommateurs lisent la même queue (file), et chaque message ne va qu’à l’un d’eux. Avec plus de consommateurs, tu traites plus de messages par seconde, mais ils peuvent finir dans le désordre.
Messaging : files, garanties de livraison et dead letters
Composition root (racine de composition)
Le seul endroit autorisé à connaître à la fois une interface et son implémentation, pour les brancher ensemble. Ici, le DataModule Hilt.
Les couches : les imports ne vont que dans un sens
Compromis (trade-off)
Ce que tu abandonnes pour obtenir ce que tu veux. La première loi de l’architecture logicielle dit que chaque décision en a un : « Tout, en architecture logicielle, est un compromis. »
L’architecture logicielle : les décisions coûteuses à changer
Conformist
Conformiste : le contexte en aval (celui qui reçoit) reprend le modèle de l’amont tel quel, parce qu’il n’a pas son mot à dire ou que traduire coûte trop cher.
Bounded contexts et context maps
Conséquences
Tout ce qui découle de la décision, le bon et le mauvais. Si tu n’as listé aucun inconvénient, cherche encore (première loi).
Les ADR : écrire le pourquoi d’une décision
Consumer-driven contract (contrat piloté par le consommateur)
Chaque consommateur écrit la partie d’un message ou d’une API qu’il lit vraiment, et le producteur fait tourner ces attentes dans sa propre CI. L’outil Pact met en œuvre ce pattern.
Stratégie de test
Conteneur (C4)
Quelque chose qui doit tourner pour que le système marche, sous forme d’un processus ou d’un stockage de données : une appli serveur, une base de données, une appli navigateur, un worker.
Les conteneurs : ce qui tourne vraiment
Contexte du système
Niveau 1. Ton système en une seule boîte, plus les personnes et les systèmes externes autour.
Le diagramme de contexte : ton système en une seule boîte
Copie
Une donnée que tu gardes sans en être propriétaire. Elle peut dater, donc tu dois savoir qui la met à jour, et tu ne la modifies jamais toi-même.
À qui appartiennent les données
Couche
Un ensemble de code avec un seul type de travail : dessiner l’écran, appliquer les règles de l’appli, stocker et récupérer les données.
Les couches : les imports ne vont que dans un sens
Couche ouverte
Une couche que celle du dessus peut sauter, pour appeler directement la couche en dessous. Avec une couche fermée, chaque appel doit passer par elle.
Les couches : les imports ne vont que dans un sens
Couplage
Ce qu’un module doit savoir d’un autre pour fonctionner. Plus de couplage veut dire qu’un changement dans l’un force un changement dans l’autre.
Couplage et cohésion dans un service de checkout
Couplage dynamique
Il se produit à l’exécution : un appel gRPC, un message dans une file. Aucun import ne relie les deux côtés, donc grep ne le voit pas.
Couplage et cohésion dans un service de checkout
Couplage statique
Visible dans le code ou le build : imports, bibliothèques partagées, code généré. Un compilateur ou un grep le trouve.
Couplage et cohésion dans un service de checkout
CQRS
Command Query Responsibility Segregation : un modèle pour modifier les données, un autre pour les lire. Martin Fowler attribue sa description à Greg Young. Il n’exige pas l’event sourcing.
CQRS et event sourcing
Dead set
L’endroit où Sidekiq garde un job après son dernier retry raté, pour qu’une personne puisse l’examiner. Un job peut refuser ce mécanisme et être jeté à la place.
Appels synchrones ou jobs asynchrones
Dead-letter queue (DLQ)
La queue où le broker range les messages qui ont échoué trop de fois. Quelqu’un doit recevoir une alerte, lire chaque message et décider quoi en faire.
Messaging : files, garanties de livraison et dead letters
Déclenchée ou continue
Les vérifications déclenchées tournent sur un événement (un commit, une release, un lancement manuel). Les continues tournent en permanence, comme le monitoring de production.
Fitness functions : des décisions qui se vérifient toutes seules
Décorateur
Une classe qui implémente le port et enveloppe d’autres implémentations du même port, pour ajouter un seul comportement, par exemple copier chaque envoi vers un second stockage.
Ports et adaptateurs : un seul cœur, plusieurs backends
Dégradation gracieuse
L’appli continue de servir ce qui marche et laisse de côté ce qui ne marche pas. La page n’affiche pas de recommandations, et le checkout fonctionne toujours.
Résilience : empêcher une panne de se propager
Dépréciation
Annoncer que quelque chose va disparaître pendant que ça marche encore. Ensuite, compter qui l’appelle encore, et le supprimer à une date donnée (le sunset).
Conception et versionnement d’API
Dérive
Le code qui s’éloigne lentement d’une décision, un changement d’apparence raisonnable à la fois.
Fitness functions : des décisions qui se vérifient toutes seules
Déterminante
Se dit des quelques caractéristiques qui façonnent la conception. Garde cette liste aussi courte que possible, trois au plus.
Les caractéristiques d’architecture : choisir les trois principales
Diagramme de conteneurs
Niveau 2 de C4. Les conteneurs dans ton système, la technologie de chacun, et la façon dont ils communiquent.
Les conteneurs : ce qui tourne vraiment
Diagramme de déploiement
Où tournent les instances de conteneurs, sur quelles machines ou quels clusters, pour un environnement donné.
Le déploiement : des boîtes sur des machines
Diagramme de flux de données
Des boîtes pour les processus et les stockages, des flèches pour les données, les parties externes dessinées à part. La carte sur laquelle se fait un threat model.
Modélisation des menaces
Diagramme dynamique
Une vue C4 d’un cas d’usage à l’exécution : les mêmes boîtes que les diagrammes statiques, avec des étapes numérotées.
Suivre une requête de bout en bout
Double écriture (dual write)
Ton code écrit dans deux stockages l’un après l’autre, sans rien qui garantisse que les deux réussissent ou que les deux échouent.
La cohérence entre plusieurs stockages
Entity
Entité : un objet qui a une identité, et cette identité dure pendant que ses attributs changent. Leo reste le même animal quand on corrige son nom ou sa date de naissance.
Les briques du DDD : à l’intérieur d’un bounded context
Événement
Un fait qui s’est produit, nommé au passé et jamais modifié : OrderCancelled. Le store garde les événements dans l’ordre et les numérote par stream.
CQRS et event sourcing
Événement publié
Un message que le propriétaire envoie après un changement (« prix modifié »), pour que les autres puissent réagir sans lire sa base.
À qui appartiennent les données
Event store
Un journal d’événements en ajout seul (append-only), un stream par agrégat. Rejouer un stream donne l’état courant de l’agrégat.
CQRS et event sourcing
Event-driven
Pilotée par les événements : les parties réagissent à des événements au lieu de s’appeler directement. Bien pour découpler, plus dur à tracer et à tester.
Les styles d’architecture
Expand / contract
Aussi appelé parallel change. Ajoute la nouvelle forme à côté de l’ancienne, fais basculer les lecteurs et les écrivains, supprime l’ancienne forme en dernier. Les trois étapes sortent souvent dans trois releases.
Migrations de schéma et de données
Fail open, fail closed
Ce que fait un contrôle quand il ne peut pas s’exécuter. Fail open laisse passer la requête. Fail closed la refuse.
Les scénarios de qualité : rendre « sécurisé » testable
Fan-out
Un événement qui déclenche plein de jobs : un post copié dans le fil de chaque abonné, et envoyé au serveur de chaque abonné.
Suivre une requête de bout en bout
Fan-out
Transformer un job en plusieurs : ici, un job de livraison par inbox distante au lieu d’un seul pour tout le post.
Appels synchrones ou jobs asynchrones
Feature flag
Un interrupteur qui active un comportement par déploiement ou par tenant. Il te permet d’annuler un rollout, tant que le désactiver ne laisse pas de nouvelles données derrière.
Les décisions réversibles : portes à sens unique et à double sens
Fitness function
Une vérification objective d’une caractéristique d’architecture. La plupart sont automatisées et font passer ou échouer le build. Le livre admet aussi des vérifications manuelles, qui demandent un humain.
Fitness functions : des décisions qui se vérifient toutes seules
Frontière
La ligne entre ce que ton équipe possède et ce que d’autres possèdent. Tu modifies librement ce qui est dedans. Pour changer ce qui est dehors, tu dois te mettre d’accord avec une autre équipe ou une autre entreprise.
Le diagramme de contexte : ton système en une seule boîte
Frontière de processus
Le code des deux côtés ne peut pas partager de mémoire. Il communique par le réseau, une file ou un fichier, et chaque côté peut planter seul.
Les conteneurs : ce qui tourne vraiment
Générique (generic)
Un problème que tout le monde a et que quelqu’un a déjà bien résolu. Tu l’achètes, ou tu adoptes de l’open source.
Sous-domaines cœur, support et générique
Hit / miss
Un hit trouve la réponse dans le cache. Un miss paie l’appel lent, puis stocke en général le résultat.
Le cache
Hot path (chemin critique)
Le code que chaque requête exécute avant de pouvoir répondre. Un appel lent à cet endroit fait attendre l’utilisateur.
Suivre une requête de bout en bout
Hypothèse
Les règles autorisent des hypothèses sur des technologies que tu connais mal, tant que tu les annonces en présentant. Les mauvaises hypothèses, jamais vérifiées avec le client, valent un pouce vers le bas.
Ton premier kata : un design complet en 15 minutes
Idempotent
Le faire deux fois a le même effet que le faire une fois. Passer deux fois un statut à supprimé le laisse supprimé. Ajouter deux fois 10 € à un solde ajoute 20 €.
L’échec : timeouts, retries, idempotence
Image
Un build empaqueté, comme ghcr.io/mastodon/mastodon. La même image peut démarrer plusieurs processus différents, donc une image peut donner plusieurs conteneurs.
Les conteneurs : ce qui tourne vraiment
Interface segregation (I)
Ségrégation des interfaces : un appelant ne devrait pas dépendre de méthodes qu’il n’utilise pas. Une interface large force chaque implémentation à remplir des méthodes que personne n’appelle.
SOLID : cinq principes, lus sur du vrai code
Invalidation
Retirer ou rafraîchir une entrée parce que la source a changé. Quelqu’un doit savoir qu’elle a changé.
Le cache
Job asynchrone
L’appelant reçoit une réponse avant que le travail soit fait. Le travail tourne plus tard, depuis une file comme celles de Sidekiq dans Redis, et ses erreurs arrivent par un autre chemin, ou pas du tout.
Appels synchrones ou jobs asynchrones
Kata
Un énoncé d’entraînement : une description, les utilisateurs, les exigences, un peu de contexte en plus. Assez petit pour être esquissé d’une traite.
Ton premier kata : un design complet en 15 minutes
KEP
Kubernetes Enhancement Proposal : le design doc par lequel passe un changement de Kubernetes, avec un template fixe et un statut (provisional, implementable, implemented).
Relire un design : scénarios, portes, pannes
Liskov substitution (L)
Substitution de Liskov : toute implémentation d’une interface doit marcher partout où l’interface est attendue. Si une implémentation lève une exception là où les autres marchent, les appelants doivent savoir laquelle ils ont reçue.
SOLID : cinq principes, lus sur du vrai code
Liveness vs readiness
Une probe de liveness en échec fait redémarrer le conteneur par Kubernetes. Une probe de readiness en échec coupe seulement le trafic vers le pod. Un problème de readiness testé dans la liveness redémarre des pods en bonne santé.
Résilience : empêcher une panne de se propager
Mesure de réponse
Le nombre qui tranche entre réussi et raté, par exemple « au plus 25 tentatives par IP en 5 minutes ».
Les scénarios de qualité : rendre « sécurisé » testable
Métriques RED
Pour un service : Rate (requêtes par seconde), Errors (combien échouent), Duration (combien de temps elles prennent).
Observabilité : logs, métriques, traces
Microkernel
Un petit cœur plus des plugins qui ajoutent des fonctionnalités. On dit aussi architecture à plugins.
Les styles d’architecture
Migration post-déploiement
Une migration qui ne tourne qu’une fois que chaque serveur fait tourner le nouveau code. L’étape contract va dans une migration de ce type.
Migrations de schéma et de données
Mode de défaillance
Une façon précise de casser : ce qui tombe, ce que voit l’utilisateur, comment ça se rétablit.
Relire un design : scénarios, portes, pannes
Modérateur
Répond à tes questions en jouant le client, le chef et l’exploitation. Seul, tu écris tes questions à la place.
Ton premier kata : un design complet en 15 minutes
Multi-tenant
Un seul système en marche qui sert plusieurs tenants, au lieu d’une copie par tenant.
Multi-tenant : à qui sont ces données ?
Négociation de capacités
Le serveur liste ce qu’il sait faire, et le client vérifie la liste avant d’utiliser une fonctionnalité. Un même client marche alors avec des serveurs d’âges différents.
Conception et versionnement d’API
Niveau d’isolation
Ce que les tenants partagent : les mêmes tables, le même serveur mais des bases à eux, ou un déploiement à eux. Plus d’isolation coûte plus cher à faire tourner.
Multi-tenant : à qui sont ces données ?
Noisy neighbour
Noisy neighbour (voisin bruyant) : la charge d’un tenant qui ralentit les autres, parce qu’ils partagent du CPU, des workers ou une base de données.
Multi-tenant : à qui sont ces données ?
Open/closed (O)
Ouvert/fermé : tu ajoutes du comportement en ajoutant du code, et tu laisses intact le code qui marche. BufferedInputStream en Java ajoute un buffer à n’importe quel InputStream en l’enveloppant, sans toucher aux streams de fichier ou de socket.
SOLID : cinq principes, lus sur du vrai code
Page cache
La mémoire que le système d’exploitation utilise pour garder les données de fichiers lues et écrites récemment. Kafka s’appuie dessus au lieu de construire son propre cache.
Les caractéristiques d’architecture : choisir les trois principales
Partition (shard)
Une tranche des données, gardée par un nœud ou un cluster. Chaque ligne vit dans exactement une partition. Répartir les partitions sur plusieurs machines s’appelle le sharding.
Faire grandir les données
Partitionnement technique ou par domaine
Découper le code par couche (controllers, models, jobs) ou par zone métier (topics, sondages, chat). C’est ce qui distingue un monolithe en couches d’un monolithe modulaire.
Les styles d’architecture
Penthouse
L’étage où les gens décident de la stratégie, du budget et des risques. Ils ont besoin de la conséquence, pour pouvoir décider.
Une décision, trois publics
Périmé (stale)
La réponse en cache ne correspond plus aux données du propriétaire. Tout cache est périmé de temps en temps, donc tu dois savoir pendant combien de temps et ce que ça casse.
Le cache
Placement par annuaire
Une table de correspondance enregistre où vit chaque clé, au lieu de le calculer avec un hash. Facile d’y ajouter un nœud, mais la table elle-même doit toujours être lisible.
Faire grandir les données
Point de défaillance unique (SPOF)
Une seule boîte qui, si elle meurt, emporte tout le service avec elle.
Le déploiement : des boîtes sur des machines
Point de non-retour
L’étape après laquelle tu ne peux plus que corriger en avançant, car revenir en arrière demande une nouvelle migration. Une bonne migration en fait une seule petite étape, le plus tard possible.
Faire évoluer un système en marche sans l’arrêter
Poison message
Un message qui échoue à chaque retry, à cause de données invalides, d’un bug ou d’un champ manquant. Si tu le laisses dans la queue, il la bloque ou tourne en boucle sans fin.
Messaging : files, garanties de livraison et dead letters
Port
Une interface qui appartient au cœur, écrite avec les mots du cœur : upload, download, delete. Elle ne dit rien de la technologie qui se trouve derrière.
Ports et adaptateurs : un seul cœur, plusieurs backends
Porte à double sens
Une décision peu coûteuse à défaire : un flag de configuration, une colonne d’état, une bibliothèque derrière une interface. Décide et avance.
Les décisions réversibles : portes à sens unique et à double sens
Porte à sens unique
Une décision difficile ou impossible à défaire : des données supprimées, un contrat public, des données que tu n’as jamais enregistrées. Ralentis et écris un ADR.
Les décisions réversibles : portes à sens unique et à double sens
Projection (modèle de lecture)
Des données dérivées des écritures, façonnées pour un type de lecture. Tu peux la supprimer et la reconstruire depuis la source de vérité.
CQRS et event sourcing
Propriétaire
Le seul service autorisé à écrire une donnée. C’est lui qui fait respecter les règles (invariants) sur cette donnée.
À qui appartiennent les données
Published language
Langage publié : un format partagé et documenté que plusieurs contextes acceptent de parler à la frontière, comme une forme de message que tous les serveurs envoient.
Bounded contexts et context maps
Question bloquante
Une question à laquelle il faut répondre avant d’accepter le design. Marque-la, pour que l’auteur la trouve parmi les petites.
Relire un design : scénarios, portes, pannes
Réconciliation
Un job qui compare les copies plus tard et répare ce qui diffère.
La cohérence entre plusieurs stockages
Redondance
Deux copies ou plus, pour qu’une puisse mourir pendant que les autres continuent. Les copies ne doivent pas dépendre d’une même boîte partagée qui peut mourir aussi.
Le déploiement : des boîtes sur des machines
Référence
Seulement l’id de la donnée de quelqu’un d’autre. Tu n’as rien à synchroniser, mais tu dois demander au propriétaire pour voir le contenu.
À qui appartiennent les données
Règle de dépendance
Ici : l’UI dépend du domaine, et le domaine dépend des données. Aucun import ne remonte, donc la couche la plus basse en sait le moins sur les autres.
Les couches : les imports ne vont que dans un sens
Relais
Le code qui lit les nouvelles lignes de l’outbox et les publie. Il peut interroger la table à intervalles réguliers, ou suivre le journal de la base. Un crash après une publication peut envoyer une ligne deux fois : le relais garantit donc at-least-once.
Outbox et sagas : quand un changement touche deux systèmes
Réplica
Une copie d’une partition sur un autre nœud. Elle ajoute de la capacité de lecture et survit à la perte d’un nœud. Elle n’ajoute aucune capacité d’écriture : chaque écriture va sur chaque copie.
Faire grandir les données
Repository
Dépôt : une interface qui ressemble à une collection d’aggregates. Tu ajoutes, cherches et retires des aggregates entiers, et le code de la base de données reste derrière.
Les briques du DDD : à l’intérieur d’un bounded context
Retry avec backoff
Réessayer en attendant plus longtemps après chaque échec, pour laisser au service en difficulté le temps de récupérer. Le jitter ajoute un peu d’aléatoire à chaque attente, pour que mille clients qui ont échoué ensemble ne réessaient pas tous dans la même seconde.
L’échec : timeouts, retries, idempotence
Revue d’architecture
Lire une proposition pour y trouver les décisions coûteuses à changer, comme un comportement par défaut sur lequel d’autres équipes construisent.
Relire un design : scénarios, portes, pannes
Saga
Un processus réparti sur plusieurs services, où chaque étape est sa propre transaction locale. Si une étape suivante échoue, les étapes précédentes sont annulées par des actions de compensation.
Outbox et sagas : quand un changement touche deux systèmes
Salle des machines
L’étage où vivent le code et l’infrastructure. Les gens qui y sont ont besoin du mécanisme, pour pouvoir construire dessus.
Une décision, trois publics
Saut
Une étape où la requête passe dans une autre partie : une autre couche de code, ou un autre conteneur à travers le réseau, plus lent et qui peut tomber.
Suivre une requête de bout en bout
Scénario
Une phrase testable : qui fait quoi à quelle partie, dans quelle situation, ce que le système doit faire, et comment tu le mesures.
Les scénarios de qualité : rendre « sécurisé » testable
Seam (point de jonction)
L’endroit unique qui décide « ancien ou nouveau » pour une requête ou une donnée. Il te le faut avant de pouvoir déplacer quoi que ce soit.
Faire évoluer un système en marche sans l’arrêter
Single responsibility (S)
Responsabilité unique : un module a une seule raison de changer, un seul groupe de personnes ou une seule fonctionnalité qui demande des changements. Tu comptes les sources de changement : une classe peut faire plusieurs choses pour une seule source.
SOLID : cinq principes, lus sur du vrai code
Singleton
Une boîte qui doit tourner en un seul exemplaire : tu ne peux pas la rendre redondante en ajoutant une deuxième copie.
Le déploiement : des boîtes sur des machines
SLO
Un objectif sur ce que ressentent les utilisateurs, sur une fenêtre de temps. « 99,5 % des paiements réussissent sur 28 jours. » Les 0,5 % restants sont ton error budget.
Observabilité : logs, métriques, traces
Soft delete (suppression logique)
Marquer une ligne comme supprimée (une colonne timestamp) au lieu de la retirer. Les utilisateurs ne la voient plus, et le staff peut encore la restaurer.
Les décisions réversibles : portes à sens unique et à double sens
Source de vérité
Le stockage dont tu gardes les données quand les copies divergent. Tu l’écris en premier et tu reconstruis les autres copies à partir de lui.
La cohérence entre plusieurs stockages
Sous-domaine
Un pan de ce que fait le métier : livrer les posts aux abonnés, connecter les utilisateurs, permettre aux admins de régler des paramètres.
Sous-domaines cœur, support et générique
SSO / fournisseur d’identité
Une seule connexion pour plusieurs applis. Il émet des tokens auxquels les autres services font confiance. Keycloak est un fournisseur d’identité open source très utilisé.
Gateways, tokens et SSO
SSRF
Server-side request forgery. L’attaquant fait récupérer une URL par ton serveur à sa place, et atteint ainsi ce que seul ton serveur peut atteindre.
Modélisation des menaces
Stateless (sans état)
Un serveur qui ne garde rien entre les requêtes. N’importe quelle copie peut répondre à n’importe quelle requête, parce que l’état est rangé dans un autre stockage.
L’architecture logicielle : les décisions coûteuses à changer
Stimulus
L’événement qui arrive sur le système : une rafale de connexions, un crash, un pic de trafic.
Les scénarios de qualité : rendre « sécurisé » testable
Strangler fig
Remplacer un système progressivement : le nouveau code pousse autour de l’ancien, prend le relais morceau par morceau, et tu supprimes chaque ancienne partie quand plus rien ne l’utilise (Fowler).
Faire évoluer un système en marche sans l’arrêter
Strategy
Stratégie : plusieurs implémentations interchangeables d’une même interface. L’appelant en choisit une, ou les essaie l’une après l’autre, sans connaître leurs classes.
Design patterns : des formes nommées que tu utilises déjà
STRIDE
Six types de menaces à examiner à chaque passage : Spoofing (usurpation), Tampering (altération), Repudiation (répudiation), Information disclosure (fuite d’information), Denial of service (déni de service), Elevation of privilege (élévation de privilèges).
Modélisation des menaces
Style
La forme globale d’un système : son découpage, sa communication et ses unités de déploiement. Un style a des compromis typiques que tu peux aller vérifier.
Les styles d’architecture
Superseded (remplacé)
Le statut d’un ADR qu’un ADR plus récent a remplacé. Tu ne modifies jamais un ADR accepté pour changer la décision : tu en écris un nouveau et tu relies les deux.
Les ADR : écrire le pourquoi d’une décision
Support (supporting)
Nécessaire au métier mais sans avantage sur les concurrents. C’est en général simple, donc tu le construis à moindre coût ou tu le sous-traites.
Sous-domaines cœur, support et générique
Système externe
Un système avec lequel tu communiques sans le posséder ni le faire tourner : un fournisseur SSO, un serveur mail, le serveur d’une autre organisation.
Le diagramme de contexte : ton système en une seule boîte
Template method
Patron de méthode : une classe de base fixe les étapes d’un algorithme et laisse une ou plusieurs étapes abstraites. Les sous-classes remplissent les étapes, jamais l’ordre.
Design patterns : des formes nommées que tu utilises déjà
Tenant
Tenant (locataire) : un client dont les données doivent rester séparées de celles des autres. Dans le multisite de Discourse, un tenant est un site, identifié par son nom d’hôte.
Multi-tenant : à qui sont ces données ?
Test de bout en bout
Le système construit, piloté comme le ferait un utilisateur. Lent et large, donc garde-en quelques-uns qui prouvent que les morceaux sont bien câblés ensemble.
Stratégie de test
Test de contrat
Un test qui vérifie une doublure contre la vraie chose qu’elle remplace. Fowler : « These check that all the calls against your test doubles return the same results as a call to the external service would. » (ils vérifient que tous les appels à tes doublures renvoient les mêmes résultats qu’un appel au service externe).
Stratégie de test
Test double (doublure de test)
Un remplaçant pour quelque chose avec quoi ton code discute : un stockage en mémoire, une fausse API de paiement, un message écrit à la main. Il rend les tests rapides, et il n’est fidèle que jusqu’à la dernière fois où quelqu’un l’a comparé avec le vrai.
Stratégie de test
Timeout
Le temps que tu attends avant d’abandonner. Il te libère. Il ne te dit rien de ce qui s’est passé de l’autre côté.
L’échec : timeouts, retries, idempotence
Token
Une preuve signée que l’appelant envoie à chaque requête. Un JWT porte ses propres claims, comme qui l’a émis, pour quelle audience, et jusqu’à quand.
Gateways, tokens et SSO
Tolerant reader (lecteur tolérant)
Un consommateur qui ne lit que les champs dont il a besoin et ignore le reste. Le fournisseur peut alors ajouter des champs sans demander à personne.
Conception et versionnement d’API
Trace et span
Une trace enregistre le parcours d’une requête à travers tous les services. Un span est une étape de ce parcours, avec un début, une durée, un parent et des attributs.
Observabilité : logs, métriques, traces
Transactional outbox
Enregistre le message dans la même écriture en base que les données. Un relais séparé le lit et le publie vers le broker.
La cohérence entre plusieurs stockages
Transactional outbox
Le service écrit le message sortant dans une table, dans la même transaction que le changement : les deux sont commités, ou aucun des deux. Un relais publie la ligne plus tard.
Outbox et sagas : quand un changement touche deux systèmes
Trust boundary (frontière de confiance)
Une ligne sur cette carte où les données passent de quelqu’un à qui tu fais moins confiance à quelqu’un à qui tu fais plus confiance, ou l’inverse. Chaque flèche qui en traverse une est un endroit à examiner.
Modélisation des menaces
TTL
Time to live, durée de vie : combien de temps une entrée reste valable avant d’être jetée. Avec un TTL, personne n’a à retirer l’entrée, c’est l’horloge qui le fait.
Le cache
Value object
Objet valeur : un objet défini uniquement par sa valeur. Il est immuable, comparé par son contenu, et se vérifie lui-même à sa construction. Deux dates qui disent toutes les deux 2026-03-14 sont la même date.
Les briques du DDD : à l’intérieur d’un bounded context
Versions mélangées
Pendant un déploiement progressif, l’ancien et le nouveau code tournent en même temps sur une même base. Chaque état du schéma doit marcher pour les deux.
Migrations de schéma et de données
Vote des pairs
Pouce en haut, « bof » ou en bas. Le pouce en haut ne demande pas des schémas finis, seulement la certitude que tu pourrais les produire avec du temps.
Ton premier kata : un design complet en 15 minutes
Y-statement
Un ADR en une phrase : « Dans le contexte de…, face à…, nous avons choisi… et écarté…, pour obtenir…, en acceptant… »
Les ADR : écrire le pourquoi d’une décision