patterns
Patron CQRS (Command Query Responsibility Segregation) avec chemins de commande et de requête séparés, publication d'événements de domaine, synchronisation du modèle de lecture et transformation DTO.
Code FlowZap complet
Client { # Client Application
n1: circle label:"Start"
n2: rectangle label:"User initiates action"
n3: diamond label:"Read or write?"
n4: rectangle label:"Send command"
n5: rectangle label:"Send query"
n6: rectangle label:"Receive response"
n7: circle label:"End"
n1.handle(right) -> n2.handle(left)
n2.handle(right) -> n3.handle(left)
n3.handle(right) -> n4.handle(left) [label="Write"]
n3.handle(bottom) -> n5.handle(top) [label="Read"]
n4.handle(bottom) -> CommandSide.n8.handle(top) [label="Command"]
n5.handle(bottom) -> QuerySide.n16.handle(top) [label="Query"]
n6.handle(right) -> n7.handle(left)
}
CommandSide { # Command Side
n8: rectangle label:"Validate command"
n9: diamond label:"Command valid?"
n10: rectangle label:"Execute domain logic"
n11: rectangle label:"Persist to write store"
n12: rectangle label:"Publish domain event"
n13: rectangle label:"Return validation error"
n8.handle(right) -> n9.handle(left)
n9.handle(right) -> n10.handle(left) [label="Yes"]
n9.handle(bottom) -> n13.handle(top) [label="No"]
n10.handle(right) -> n11.handle(left)
n11.handle(right) -> n12.handle(left)
n12.handle(bottom) -> EventHandler.n14.handle(top) [label="Event"]
n12.handle(top) -> Client.n6.handle(bottom) [label="Success"]
n13.handle(top) -> Client.n6.handle(bottom) [label="Error"]
}
EventHandler { # Event Handler
n14: rectangle label:"Receive domain event"
n15: rectangle label:"Update read model"
n14.handle(right) -> n15.handle(left)
n15.handle(top) -> QuerySide.n16.handle(bottom) [label="Sync"]
}
QuerySide { # Query Side
n16: rectangle label:"Parse query parameters"
n17: rectangle label:"Query read store"
n18: rectangle label:"Transform to DTO"
n19: rectangle label:"Return results"
n16.handle(right) -> n17.handle(left)
n17.handle(right) -> n18.handle(left)
n18.handle(right) -> n19.handle(left)
n19.handle(top) -> Client.n6.handle(bottom) [label="Data"]
}
Modèles associés
Architecture
Diagramme d'architecture CQRS combinant des API de commande et de requête séparées avec un bus d'événements pour la synchronisation asynchrone du modèle de lecture, incluant des projecteurs qui construisent des vues dénormalisées à partir des événements de domaine. Ce modèle démontre la pile complète CQRS+ES où les écritures passent par la validation du domaine et les lectures sont servies depuis des vues matérialisées optimisées. Idéal pour les systèmes à haut débit où les charges de lecture et d'écriture ont des exigences de mise à l'échelle fondamentalement différentes.
patterns
Modèle de sourcing d'événements avec capture d'événements, persistance en magasin d'événements, reconstruction d'agrégats, optimisation par instantanés et requêtes d'état temporel.
patterns
Pattern d’orchestration Saga pour transactions distribuées entre les services Commande, Paiement et Expédition avec compensation et retour arrière automatiques en cas d’échec.
patterns
Ce flux de travail modélise la comparaison de deux versions pour voir laquelle donne les meilleures performances.
patterns
Schéma de passerelle API avec authentification des requêtes, limitation de débit, routage des requêtes vers les services backend, agrégation des réponses et gestion des erreurs.
patterns
Ce workflow modélise la journalisation de toutes les actions importantes à des fins de conformité.