Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Einführung in CQRS/ES mit Java

Einführung in CQRS/ES mit Java

Man hört mittlerweile vielerorts die Schlagworte CQRS und Event Sourcing. Aber was ist das genau?

In diesem Vortrag möchte ich euch die Schlagworte ein wenig näher bringen. Wir lernen was CQRS bedeutet, warum es verwendet wird und welche Tradesoffs wir bei seiner Verwendung eingehen.

Danach beschäftigen wir uns mit dem Event Sourcing. Woher es kommt und warum es so häufig in Kombination mit CQRS verwendet wird.

Abrunden werden wir das Ganze mit zwei Codebeispielen aus der Java Welt, die aus der Domäne des Banking stammen. Wir werden uns dort genauer ansehen, wie wir CQRS/ES einmal objektorientiert und einmal funktional umsetzen können.

Avatar for Frank Seidinger

Frank Seidinger

July 26, 2018
Tweet

Other Decks in Programming

Transcript

  1. Frank Seidinger [email protected] aixo.com 03.08.2018 3 Mastertitelformat bearbeiten Frank Seidinger

    [email protected] aixo.com 03.08.2018 3 CQRS Begriff Steht als Akronym für Command Query Responsibility Segregation Segregation bezeichnet dabei im allgemeinen die (vollständige) Trennung von Personen oder Dingen
  2. Frank Seidinger [email protected] aixo.com 03.08.2018 5 Mastertitelformat bearbeiten Frank Seidinger

    [email protected] aixo.com 03.08.2018 5 CQRS Bedeutung Im CQRS Konzept wird die vollständige Trennung der Verantwortlichkeiten für das Schreiben und das Lesen in einem Softwaresystem verstanden
  3. Frank Seidinger [email protected] aixo.com 03.08.2018 6 Mastertitelformat bearbeiten Frank Seidinger

    [email protected] aixo.com 03.08.2018 6 CQRS Bedeutung Formuliert Anweisung Prüft Anweisung Stellt Status Veröffentlicht Event Projiziert Events Event Command Status
  4. Frank Seidinger [email protected] aixo.com 03.08.2018 8 Mastertitelformat bearbeiten Frank Seidinger

    [email protected] aixo.com 03.08.2018 8 CQRS Verantwortlichkeiten Schreibsystem: • Nimmt Anweisungen (Intentionen) entgegen • Prüft die Validität der Anweisungen • Teilt das Ergebnis in Form von Events mit Einfache Regel: Anweisungen sind verhandelbar und können wiederholt werden, Events sind es nicht.
  5. Frank Seidinger [email protected] aixo.com 03.08.2018 9 Mastertitelformat bearbeiten Frank Seidinger

    [email protected] aixo.com 03.08.2018 9 CQRS Modellierung Schreibseite Command Event Command Handler State
  6. Frank Seidinger [email protected] aixo.com 03.08.2018 10 Mastertitelformat bearbeiten Frank Seidinger

    [email protected] aixo.com 03.08.2018 10 CQRS Verantwortlichkeiten Woran wird die Validität einer Anweisung festgemacht? • Art des Anweisung • Inhalt der Anweisung • Status des Systems (Aggregate, Prozesse)
  7. Frank Seidinger [email protected] aixo.com 03.08.2018 11 Mastertitelformat bearbeiten Frank Seidinger

    [email protected] aixo.com 03.08.2018 11 CQRS Verantwortlichkeiten Lesesystem: • Verarbeitet (laufend) eingehende Events • Projiziert daraus Status • Bietet den Status für Klienten an Weiteres: • Häufig auf Basis von Streaming
  8. Frank Seidinger [email protected] aixo.com 03.08.2018 13 Mastertitelformat bearbeiten Frank Seidinger

    [email protected] aixo.com 03.08.2018 13 Warum sollte ich das machen? • Es ist leichter ein System zu schreiben, dass nur eine Verantwortlichkeit trägt. • Es wird häufig sehr viel öfter in einem System gelesen als geschrieben. • Schreiben zielt häufig nur auf ein Aggregat ab. Beim Lesen werden (durch GUIs getrieben) oft vielfältige Informationen zusammengefasst. • Benutzer erwarten beim Lesen eine höhere Performance und akzeptieren leichter eine Verzögerung, wenn Änderungen am System vorgenommen werden.
  9. Frank Seidinger [email protected] aixo.com 03.08.2018 14 Mastertitelformat bearbeiten Frank Seidinger

    [email protected] aixo.com 03.08.2018 14 Zu welche Konsequenzen führt das? • Schreiben und Lesen können an verschiedenen Orten stattfinden • Lesen kann an vielen Orten stattfinden • Ich kann und darf Optimierungen am Modell getrennt für das Schreiben und das Lesen vornehmen. • Schreiben und Lesen können getrennt entwickelt, getestet und betrieben werden
  10. Frank Seidinger [email protected] aixo.com 03.08.2018 16 Mastertitelformat bearbeiten Frank Seidinger

    [email protected] aixo.com 03.08.2018 16 Zu welche Konsequenzen führt das? public class Person { ... public String getId() { return id; } ... public String getName() { return name; } public String getGivenName() { return givenName; } private String getLongName() { return name + ", " + givenName; } private String getDisplayName() { return givenName + " " + name; } } public class Person { private String id; private LocalDate birthday; }
  11. Frank Seidinger [email protected] aixo.com 03.08.2018 17 Mastertitelformat bearbeiten Frank Seidinger

    [email protected] aixo.com 03.08.2018 17 Was ist daran schwierig? • Ich muss gemeinsam fachlich modellieren (!!!!!) • • • • Ich muss mich mit Menschen auseinandersetzen • Ich muss meine Organisation ändern • Ich muss mich um Infrastrukturen, z.B. Warteschlangen kümmern • Zeit spielt eine Rolle • Ich bin gezwungen über eine fachliche Betriebsunterstüzung nachzudenken
  12. Frank Seidinger [email protected] aixo.com 03.08.2018 18 Mastertitelformat bearbeiten Frank Seidinger

    [email protected] aixo.com 03.08.2018 18 Was ist daran schwierig? • Aufgabe von gelernten Denkmustern notwendig. Denn Entlernen ist schwieriger als neu lernen • Anämische Entitäten und darauf arbeitende Services werden durch fachlich motivierte Komponenten ersetzt • Anerkennung, dass es keine Zeitgleichheit oder strikte Reihenfolge von passierten Dingen gibt • Daher auch keine Synchronität von Businesstransaktionen • Keine Technik der Welt kann mir helfen, wenn ich meine Domäne nicht verstehe Hinweis: Technik kann ich immer fixen, daran ist nichts kompliziertes
  13. Frank Seidinger [email protected] aixo.com 03.08.2018 20 Mastertitelformat bearbeiten Frank Seidinger

    [email protected] aixo.com 03.08.2018 20 Event Sourcing Bedeutung Beim Event Sourcing werden die als (Domänen) Events veröffentlichten Business Facts in einem Eventlog (Transaktionslog) gespeichert. Das Eventlog bietet damit eine Single Source of Truth für Business Facts und gleichzeitig die komplette Historie des Systems. Der Status z.B. eines Aggregats wird als abgeleitete Größe (Funktion bzw. Projektion) der Events betrachtet
  14. Frank Seidinger [email protected] aixo.com 03.08.2018 21 Mastertitelformat bearbeiten Frank Seidinger

    [email protected] aixo.com 03.08.2018 21 Event Sourcing Basics State ist das Ergebnis einer Funktion der bereits bestehenden Events State Event
  15. Frank Seidinger [email protected] aixo.com 03.08.2018 22 Mastertitelformat bearbeiten Frank Seidinger

    [email protected] aixo.com 03.08.2018 22 Beispiel Excel Konten bewegungen Kontostand 5,00 € 1,95 € -3,00 € 0,75 € -0,80 € Der Kontostand als Summe der Kontenbewegungen
  16. Frank Seidinger [email protected] aixo.com 03.08.2018 23 Mastertitelformat bearbeiten Frank Seidinger

    [email protected] aixo.com 03.08.2018 23 Event Sourcing Basics Neue Events sind das Ergebnis einer Funktion aus Kommando und Status State Event Command
  17. Frank Seidinger [email protected] aixo.com 03.08.2018 24 Mastertitelformat bearbeiten Frank Seidinger

    [email protected] aixo.com 03.08.2018 24 Event Sourcing Basics Es gibt (mindestens) zwei Arten, den State aus einem Eventlog zu erhalten 1. Aus einzelnen Logs, die nach Aggregaten organisiert (vorverarbeitet) ist. Diese Variante wird üblicherweise als Eventstore bezeichnet 2. Aus einem einzigen Log, dass nach Aggregaten gefiltert wird
  18. Frank Seidinger [email protected] aixo.com 03.08.2018 26 Mastertitelformat bearbeiten Frank Seidinger

    [email protected] aixo.com 03.08.2018 26 CQRS/ES Basics Wir benötigen: 1. Aufteilen der Funktionen in: a) Apply Funktion b) Replay Funktion c) Decide Funktion (aka Command Handler) 2. Dependecy Injection 3. Inversion of Control 4. Event Driven Architecture 5. Ein wenig Infrastruktur
  19. Frank Seidinger [email protected] aixo.com 03.08.2018 27 Mastertitelformat bearbeiten Frank Seidinger

    [email protected] aixo.com 03.08.2018 27 Apply Funktion Die Apply Funktion erstellt auf Basis von Status und Event einen neuen Status State Event State
  20. Frank Seidinger [email protected] aixo.com 03.08.2018 28 Mastertitelformat bearbeiten Frank Seidinger

    [email protected] aixo.com 03.08.2018 28 Apply Funktion Die Replay Funktion erstellt aus einem Initialstatus und einer Liste von Events den aktuellen Status Current State Initial State Event
  21. Frank Seidinger [email protected] aixo.com 03.08.2018 29 Mastertitelformat bearbeiten Frank Seidinger

    [email protected] aixo.com 03.08.2018 29 Decide Funktion Die Decide Funktion erstellt aus Command und Status neue Events State Command Event
  22. Frank Seidinger [email protected] aixo.com 03.08.2018 30 Mastertitelformat bearbeiten Frank Seidinger

    [email protected] aixo.com 03.08.2018 30 CQRS/ES Basics Sonst noch 1. Prozessmanager (aka Saga). Er reagiert auf Events, besitzt einen eigenen Status und gibt Anweisungen aus. 2. Policy. Sie reagiert auf eingehende Events und sendet davon abhängige Events aus. Synonyme sind Regel 3. Auch Zeit ist ein Event. Beispiele: nach drei Wochen, Immer zu Beginn des Quartals, am 31.12.
  23. Frank Seidinger [email protected] aixo.com 03.08.2018 31 Mastertitelformat bearbeiten Frank Seidinger

    [email protected] aixo.com 03.08.2018 31 Warum sollte ich das machen? • • Neue Projektionen können sofort auf Basis der Historie in Betrieb genommen werden. • Fehler können durch Replay und Kompensationen behoben werden. • Kompensationen/Migrationen sind selbst Teil des Modells und können nachvollziehbar implementiert werden. • Es findet eine starke Entkopplung der einzelnen Domänen voneinander statt.
  24. Frank Seidinger [email protected] aixo.com 03.08.2018 32 Mastertitelformat bearbeiten Frank Seidinger

    [email protected] aixo.com 03.08.2018 32 Zu welche Konsequenzen führt das? • Das Modell existiert nur noch im Speicher. • Es wird nur aus Events erzeugt. Wir benötigen also weder einen ORM-Mapper, noch ein Datenbankmodell, etc. Das ist Infrastruktur Reduced to the Max. • Ich besitze immer die volle Historie und kann sie für Fehler in der Software und die Weiterentwicklung meines Business einsetzten. • Eine Migration findet jetzt fachlich im Modell statt. Sie kann wie jede andere Fachlichkeit getestet werden. • Die Domänen lassen sich ohne Infrastruktur vollständig fachlich testen • Zeitreisen sind einfach und nur noch Projektionen.
  25. Frank Seidinger [email protected] aixo.com 03.08.2018 33 Mastertitelformat bearbeiten Frank Seidinger

    [email protected] aixo.com 03.08.2018 33 Was ist daran schwierig? (zusätzlich zu CQRS) • Events als Single Source of Truth anzuerkennen • Projektionen verstehen • Die NFAs richtig zu bewerten • • •