CQRS (Command Query Responsibility Segregation) als Architektur-Pattern sieht vor, dass lesende (Queries) und schreibende Zugriffe (Commands) in getrennten Subsystemen auf unterschiedlichen Modellen realisiert werden. Während Commands meist asynchron und transaktional angestoßen werden, arbeiten Queries mit denormalisierten Views auf “eventual consistent” Daten. Ziel ist eine hoch skalierbare, hoch performante und sichere Plattform. Was sich zunächst einmal nach zusätzlichem Aufwand anhört, bringt in der Praxis eine Menge Vorteile mit sich. Die Session zeigt die wesentlichen Ideen von CQRS auf und demonstriert anhand eines praktischen Beispiels die Vorteile dieses Ansatzes im Kontext von Web APIs.
3. Lars Röwekamp (a.k.a. @mobileLarson)
ÜBER MICH
LR
#WISSENTEILEN
Wer bin ich - und wen ja, wie viele?
• CIO New Technologies
• Enterprise & Mobile
• Autor, Speaker, Coach & Mentor
• Snowboard & MTB Enthusiast
• mehrfacher Vater, einfacher Ehemann
52. #WISSENTEILEN
CQRS & Event Sourcing
... Änderungen „sammeln“ statt State updaten!
State vs. immutable Facts ...
BTW: Immutable!
53. #WISSENTEILEN
CQRS & Event Sourcing
... Änderungen „sammeln“ statt State updaten!
State vs. immutable Facts ...
BTW: Immutable!
54. #WISSENTEILEN
CQRS & Event Sourcing
... Änderungen „sammeln“ statt State updaten!
State vs. immutable Facts ...
55. #WISSENTEILEN
CQRS & Event Sourcing
... Änderungen „sammeln“ statt State updaten!
State vs. immutable Facts ...
56. CQRS & Event Sourcing
#WISSENTEILEN
Festhalten der Änderungen via Events
• speichern der Events in korrekter Reihenfolge
• vollständige Historie implizit
• keine „Updates“ oder „Deletes“
• kein „Current State“
• „Current State“ ergibt sich durch „Replay“ der
Events für einen bestimmten Zeitpunkt!
57. CQRS & Event Sourcing
#WISSENTEILEN
Festhalten der Änderungen via Events
• „Kein“ Locking bei konkurrierenden Zugriffen
(Repräsentation durch zwei Events)
• Evolution des Models problemlos möglich
(neueinspielen der Events)
• Tests auf Command- & Eventebene
(wenn dieses Command, dann das Ergebnis)
62. CQRS & Event Sourcing
#WISSENTEILEN
Ist das nicht super langsam?
• In der Regel wenige Events pro Aggregate
• Problem bei langlebenden Entities
• Problem bei regelmäßigen Änderungen
• Snapshots als Lösung (Momento Pattern)
• ABER: Events niemals ändern/löschen!
70. CQRS & Event Sourcing
#WISSENTEILEN
JA! Denn, ...
• es ist extrem schnell für den Anwender
• es ist extrem einfach skalierbar
• es ist extrem einfach erweiterbar
• das Domänen-Modell bleibt konsistent
• Fehler können rekonstruiert werden
• Auditing & History gibt es quasi geschenkt
76. FAZIT
#WISSENTEILEN
Die Benefits
• Fachlichkeit im Fokus (auch im Code!)
• Optimierung auf „Komponentenebene“
• max. Performance für High-Load Szenarien
• getrennte Evolution möglich (fachl./tech.)
• detaillierte Nachverfolgung aller Vorgänge
• Total Cost of Ownership
77. FAZIT
#WISSENTEILEN
Die Pitfals
• Komplexität gegenüber CRUD Anwendungen
• Performance bei Event-Replay
• Seiteneffekte durch Event-Replay / Snapshot
• Eventual Consistency in Query Views
• Concurrent Writes durch Commands
• Ramp-Up Zeit