Chaque donnée dans un système d'information soulève trois questions que tout architecte doit se poser :
flowchart TB
Donnee["Donnée"]
Donnee --> Q1["1. Qui en est propriétaire ? <br> source de vérité"]
Donnee --> Q2["2. Où est-elle stockée ? <br> localisation, latence"]
Donnee --> Q3["3. Qui peut la lire / modifier ? <br> cohérence, accès concurrent"]
Dans un système distribué, la même information peut exister à plusieurs endroits (cache, réplicas, copies dans d'autres services). Il faut désigner une seule source de vérité pour chaque donnée.
flowchart LR
subgraph bon ["Bonne pratique — source de vérité unique"]
SvcCat["Service Catalogue<br>(source de vérité du prix)"]
SvcCart["Service Panier<br>(lit le prix via API)"]
SvcOrder["Service Commande<br>(copie le prix commande)"]
SvcCart -->|"GET /products/sku-A/price"| SvcCat
SvcOrder -->|"stocke prix = 29.90€ à t=0"| SvcOrder
end
flowchart LR
subgraph mauvais ["Anti-pattern — plusieurs sources de vérité"]
SvcA["Service A <br> prix = 29.90€"]
SvcB["Service B <br> prix = 31.00€ (!sync)"]
SvcC["Service C <br> prix = 28.50€ (cache périmé)"]
User["Utilisateur"] -->|"voit des prix différents"| SvcA & SvcB & SvcC
end
| Donnée | Propriétaire (source de vérité) | Les autres font... |
|---|---|---|
| Prix d'un produit | Service Catalogue | Lisent le prix via API au moment de la mise au panier ; figent une copie du prix dans la commande au moment du paiement — le prix historique ne doit jamais changer si le catalogue évolue |
| Statut d'une commande | Service Commande | Consomment l'événement OrderStatusChanged pour mettre à jour leurs propres projections (ex : Service Notification envoie un email, Service Livraison prépare l'expédition) |
| Solde d'un compte | Service Paiement | Ne stockent jamais de copie — interrogent l'API dédiée à chaque besoin ; toute lecture locale serait potentiellement périmée et constituerait un risque financier |
| Nom / email de l'utilisateur | Service Compte | Stockent uniquement l'identifiant (userId) ; récupèrent les champs d'affichage à la demande via API, ou en copient un sous-ensemble minimal (ex : displayName) si la lecture est très fréquente |