CQRS, der etwas andere Architekturansatz

85
C Q R S Der etwas andere Architekturansatz Lars Röwekamp CIO New Technologies @mobileLarson @_openknowledge #WISSENTEILEN

Transcript of CQRS, der etwas andere Architekturansatz

Page 1: CQRS, der etwas andere Architekturansatz

C Q R SDer etwas andere Architekturansatz

Lars RöwekampCIO New Technologies

@mobileLarson@_openknowledge

#WISSENTEILEN

Page 2: CQRS, der etwas andere Architekturansatz

Branchenneutrale Softwareentwicklung und IT-Beratung

ÜBER OPEN KNOWLEDGE

#WISSENTEILEN

Page 3: CQRS, der etwas andere Architekturansatz

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

Page 4: CQRS, der etwas andere Architekturansatz

Es könnte alles so einfach sein!

Page 5: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

CQRS

Page 6: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

CQRS

Page 7: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

CQRS

Greetingsfrom

Eric

Page 8: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

CQRS

Greetingsfrom

Eric

Page 9: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

CQRS

Greetingsfrom

Eric

In sich konsistentes Modell viaAggregates, Entities, Value Objects, Builder, Services, Repositories, ...

Validierung, Relationen, Mapping, Rules ...

Page 10: CQRS, der etwas andere Architekturansatz

Isses aber nich ...

Page 11: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

CQRS

Greetingsfrom

Eric

In sich konsistentes Modell viaAggregates, Entities, Value Objects, Builder, Services, Repositories, ...

Validierung, Relationen, Mapping, Rules ...

Page 12: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

CQRS Write

Page 13: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

CQRS Read

Page 14: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

CQRS

Page 15: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

CQRS ReadWrite

Page 16: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

CQRS

Page 17: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

CQRS

Page 18: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

CQRS

Page 19: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

CQRS

Verletzung des SRP auf Architekturebene

Page 20: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

CQRS

Benutzerinteraktion vs. Datenbereitstellung

Page 21: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

CQRS

Domänen-Modell als Kompromiss für „Read“ & „Write“

Page 22: CQRS, der etwas andere Architekturansatz

CQRS

#WISSENTEILEN

Domänen-Modell als Kompromiss für R & W

• Business vs. Technologie? • Entities, DTOs, VOs?• Architektur Over-Engineering• Optimistic Locking• Caching

Page 23: CQRS, der etwas andere Architekturansatz

CQRS

#WISSENTEILEN

Domänen-Modell als Kompromiss für R & W

• Read vs. Write Performance• Read vs. Write Skalierung• Read vs. Write Optimierung

Page 24: CQRS, der etwas andere Architekturansatz

CQRS

#WISSENTEILEN

Klassische Ein-Domänen Architektur

Die Komplexität der Änderungen & Erweiterungen steigt mit der Komplexität des Domänenmodells

Page 25: CQRS, der etwas andere Architekturansatz

„A single model cannot beappropriate for reporting,

searching, and transactionalbehaviors.” Greg Young

Page 26: CQRS, der etwas andere Architekturansatz

„Every method should either bea command, that performs an action or a query that returns

data to the caller, but not both.”Bertrand Meyer

Page 27: CQRS, der etwas andere Architekturansatz

„Every method should either bea command, that performs an action or a query that returns

data to the caller, but not both.”Bertrand Meyer

Page 28: CQRS, der etwas andere Architekturansatz

Bertrand Meyer

C ommandQ ueryR ?S ?

Page 29: CQRS, der etwas andere Architekturansatz

Bertrand Meyer

C ommandQ ueryR esponsibilityS egregation

Page 30: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

CQRS

Page 31: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

CQRS

Page 32: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

CQRS

Page 33: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

CQRS

CreateCutomer

CutomerCreated

Find all Customers with ...

Page 34: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

CQRS// BEFORE: CRUD based interface with no DDD usage

interface CustomerService {

Customer createCustomer(Customer cust); void updateCustomer(Customer cust); void deleteCustomer(String id);

Customer getCustomer(String id); List<Customer> findCustomer(String query);

}

Page 35: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

CQRS// AFTER: CQRS based interfaces with DDD usage

interface CustomerQueryService {

Customer findCustomerWith(Name uniqueName);List<Customer> findAllCustomerMatching(SearchQuery sq);

}

interface CustomerCommandService {

Customer moveTo(Address newAddress);Customer marry(Name newName, Partner partner);

}

Page 36: CQRS, der etwas andere Architekturansatz

Und was bedeutet das für die

Architektur?

Page 37: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

CQRS

ReadSide...

• optimiertfürAbfragen• kurzeAntwortzeiten• unterschiedliche„Sichten“• einfachzuskalieren• möglichstdenormalisiert

WriteSide...

• „Kommandos“ausführen• Validierung• Datenkonsistenz• ACID• VerhaltenTeilderDomäne

Page 38: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

CQRS

Page 39: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

CQRS

Page 40: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

CQRS

Page 41: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

CQRS

Page 42: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

CQRS

Page 43: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

CQRS

Page 44: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

CQRS

Page 45: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

FAZIT

„Starbucksdoes notuseTwo-PhaseCommit“

http://www.enterpriseintegrationpatterns.com/ramblings/18_starbucks.html

Page 46: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

CQRS

Page 47: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

CQRS

Page 48: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

CQRS

Page 49: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

CQRS

Page 50: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

CQRS Write Read

Page 51: CQRS, der etwas andere Architekturansatz

Moment, was macht ihr da mit meinen

„Entities“?

Page 52: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

CQRS & Event Sourcing

... Änderungen „sammeln“ statt State updaten!

State vs. immutable Facts ...

BTW: Immutable!

Page 53: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

CQRS & Event Sourcing

... Änderungen „sammeln“ statt State updaten!

State vs. immutable Facts ...

BTW: Immutable!

Page 54: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

CQRS & Event Sourcing

... Änderungen „sammeln“ statt State updaten!

State vs. immutable Facts ...

Page 55: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

CQRS & Event Sourcing

... Änderungen „sammeln“ statt State updaten!

State vs. immutable Facts ...

Page 56: CQRS, der etwas andere Architekturansatz

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!

Page 57: CQRS, der etwas andere Architekturansatz

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)

Page 58: CQRS, der etwas andere Architekturansatz

WT#?

Page 59: CQRS, der etwas andere Architekturansatz

Wo bleibt da die Konsistenz?

Page 60: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

FAZIT

„Starbucksdoes notuseTwo-PhaseCommit“

http://www.enterpriseintegrationpatterns.com/ramblings/18_starbucks.html

Page 61: CQRS, der etwas andere Architekturansatz

Ist das nicht super langsam?

Page 62: CQRS, der etwas andere Architekturansatz

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!

Page 63: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

CQRS & Event Sourcing

Page 64: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

CQRS & Event Sourcing

Page 65: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

CQRS & Event Sourcing

Page 66: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

CQRS & Event Sourcing

Page 67: CQRS, der etwas andere Architekturansatz

Still timefor a Demo?

Page 68: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

CQRS & Event Sourcing

(siehehttps://blog.jayway.com/2013/03/08/aggregates-event-sourcing-distilled/)

Page 69: CQRS, der etwas andere Architekturansatz

Muss das denn so kompliziert sein?

Page 70: CQRS, der etwas andere Architekturansatz

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

Page 71: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

Page 72: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

FAZIT

Page 73: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

FAZIT

Page 74: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

FAZIT

Page 75: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

FAZIT

Page 76: CQRS, der etwas andere Architekturansatz

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

Page 77: CQRS, der etwas andere Architekturansatz

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

Page 78: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

Two modelsto rule them all.

FAZIT

Page 79: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

Focus on Business first!

FAZIT

Page 80: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

Schrei nach Consistencyist meist das Fehlen eines

fachlichen Plan B!

FAZIT

Page 81: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

Microservices & JEE?Best Friends Forever!

FAZIT„BFF“

Best Friends Forever!

Page 82: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

Page 83: CQRS, der etwas andere Architekturansatz

#WISSENTEILEN

? # !

Page 84: CQRS, der etwas andere Architekturansatz

LARS RÖWEKAMPCIO NEW TECHNOLOGIES

[email protected]+49 (0) 441 4082 – 0

@mobileLarson@_openknowledge

OFFENKUNDIGGUT

KOTAKT

#WISSENTEILEN

Page 85: CQRS, der etwas andere Architekturansatz

#80: © marekuliasz– shutterstock.com#1, #45, #79: pixabay.com

Icons in this presentation designed by “Freepik”,

BILDNACHWEISE

#WISSENTEILEN