22. Januar 2024 von Tino Kiemann
Komplexe Probleme, intelligente Lösungen: DDD, CQRS, ES und die Rolle von Axon
Wie entwickelt man heute eine hochverfügbare, skalierbare und wartungsfreundliche Anwendung? In diesem Blog-Beitrag gebe ich euch einen kurzen Überblick über Ansätze, Methoden und Werkzeuge, die meiner Meinung nach diese Anforderungen erfüllen können. Ich erkläre, wie Domain Driven Design (DDD) die Kommunikation verbessert, Command Query Responsibility Segregation (CQRS) die Komplexität großer Domänenmodelle reduziert und Event Sourcing den Modellzustand effizient verfolgt. Außerdem stelle ich Axon als umfassende Plattform vor, die das Axon Framework und den Axon Server umfasst.
Stellt euch vor, ihr steht vor der Herausforderung, eine Softwarelösung für ein komplexes Geschäftsproblem zu entwickeln. Ihr wollt zum Beispiel eine E-Commerce-Plattform entwickeln, die Bestellungen verwaltet, den Lagerbestand prüft und Zahlungen abwickelt. Aber wie stellt man sicher, dass das System effizient, erweiterbar und skalierbar ist? Hier kommt DDD ins Spiel, ein Ansatz, der sich auf die Modellierung der Geschäftsdomäne konzentriert und die Kommunikation zwischen allen Beteiligten verbessert.
Domain-Driven Design (DDD) als Schlüssel zur effizienten Kommunikation
DDD hilft, eine gemeinsame Sprache und ein gemeinsames Verständnis zwischen Entwicklerinnen, Entwicklern, Fachleuten und anderen Beteiligten zu schaffen. Dadurch können Missverständnisse vermieden und die Effizienz der Zusammenarbeit gesteigert werden. Bei der Entwicklung einer E-Commerce-Plattform bedeutet es, dass die gesamte Funktionalität und Logik rund um Bestellungen, Inventar und Zahlungen klar definiert und verstanden wird.
Command Query Responsibility Segregation (CQRS) zur Reduzierung der Komplexität großer Domänenmodelle
Eine Herausforderung bei der Modellierung großer Gebiete ist die zunehmende Komplexität des Modells. Hier kommt CQRS ins Spiel. Mit CQRS wird die Anwendung in ein Befehlsmodell und ein Abfragemodell aufgeteilt. Das Befehlsmodell ist für die Ausführung von Aufgaben zuständig, die die Domäne verändern. Das Abfragemodell ist für die Bereitstellung von Informationen zuständig, indem es die Daten so aufbereitet, wie sie später benötigt werden. Dieser Ansatz reduziert die Komplexität großer Domänenmodelle erheblich und ermöglicht eine bessere Skalierbarkeit. Für unsere E-Commerce-Plattform bedeutet dies, dass wir Bestellungen effizient abwickeln und gleichzeitig schnelle Abfragen zu Lagerbeständen durchführen können.
Events als Schnittstelle zwischen Befehls- und Abfragemodell
Die Aufteilung der Anwendung wirft jedoch ein neues Problem auf: Wie bleiben die Modelle synchron? Hier kommen Ereignisse ins Spiel. Ereignisse dienen als Schnittstelle zwischen dem Befehlsmodell und dem Anfragemodell. Sobald das Befehlsmodell eine Aufgabe ausgeführt hat, beispielsweise den Befehl "Bestellung aufgeben", erzeugt es das Ereignis "Bestellung aufgegeben". Dieses Ereignis kann dann vom Abfragemodell verarbeitet werden, um die erforderlichen Daten für schnelle Abfragen bereitzustellen. Auf diese Weise bleibt das System konsistent und synchron.
Asynchrone Kommunikation und Microservices
Ein weiterer wichtiger Aspekt von Events ist die asynchrone Kommunikation zwischen Microservices. Durch die Verwendung von Events als Kommunikationsmechanismus können Microservices unabhängig voneinander arbeiten und sich über Events austauschen. Das heißt, ein Microservice kann ein Event erzeugen und an andere Microservices senden, ohne deren sofortige Verarbeitung abzuwarten. Diese asynchrone Kommunikation ermöglicht eine bessere Skalierbarkeit und Flexibilität des Gesamtsystems und fördert eine lose Kopplung zwischen den einzelnen Komponenten.
Event Sourcing für effiziente Modellzustandsverfolgung
Dies führt uns zu Event Sourcing (ES), einer weiteren leistungsfähigen Technik. Traditionell würde man den aktuellen Zustand des Modells speichern. Mit ES geht man einen anderen Weg: Man speichert die Ereignisse, die zu diesem Zustand geführt haben. Diese Ereignisse sind unveränderlich, und wenn man sie in der richtigen Reihenfolge abspielt, erhält man immer den aktuellen Zustand des Modells. Im Falle unserer E-Commerce-Plattform bedeutet dies, dass wir ein vollständiges Protokoll aller Bestellungen, Bestandsänderungen und Zahlungen haben. Diese Ereignisse bieten nicht nur die Möglichkeit für Data Mining und Reporting, sondern ermöglichen auch eine genaue Rückverfolgung und Rekonstruktion des Systemzustands zu einem bestimmten Zeitpunkt.
Axon als umfassende Plattform für DDD, CQRS und ES
Die Implementierung von DDD, CQRS und ES kann jedoch eine komplexe Herausforderung darstellen. Sie erfordert eine umfangreiche Infrastruktur und kann schnell außer Kontrolle geraten. Aber es gibt eine Lösung: AxonIQ bietet eine Plattform namens Axon, die speziell für diesen Zweck entwickelt wurde.
Die Bestandteile von Axon: Framework und Server
Axon besteht aus zwei Komponenten, dem Axon Server und dem Axon Framework:
- Der Axon Server ist ein hoch skalierbarer, verteilter Ereignisspeicher, der nicht nur die Speicherung und Bereitstellung von Ereignissen ermöglicht, sondern auch die Weiterleitung von Befehlen und Anfragen an die entsprechenden Komponenten im System erleichtert.
- Das Axon Framework stellt die notwendigen Bausteine für die Implementierung von DDD, CQRS und ES zur Verfügung und ermöglicht es Entwicklern, sich auf die eigentliche Domänenlogik zu konzentrieren.
Axon bietet noch viele weitere Vorteile. So lässt es sich beispielsweise nahtlos in bestehende Cloud-Infrastrukturen wie Kubernetes integrieren. Dadurch können mit Axon entwickelte Anwendungen flexibel und skalierbar bereitgestellt werden. Darüber hinaus bietet Axon verschiedene Erweiterungen für die Anbindung von Drittanbietern wie beispielsweise Kafka.
Fazit
Zusammenfassend stellt die Kombination von Domain-Driven Design, Command Query Responsibility Segregation, Event Sourcing und der umfassenden Axon-Plattform einen leistungsfähigen Ansatz für die Entwicklung moderner, hochverfügbarer Anwendungen dar.
Der Fokus liegt auf einer einheitlichen Sprache, der Trennung von Kommandos und Abfragemodellen sowie der effizienten Modellierung von Modellzuständen durch Event Sourcing. Auf diese Weise wird nicht nur die Komplexität beherrschbar, sondern auch die Grundlage für skalierbare und benutzerfreundliche Systeme geschaffen.
Axon als Plattform erleichtert die Implementierung dieser anspruchsvollen Konzepte und ermöglicht es Entwicklern, sich auf die wesentlichen Aspekte ihrer Domäne zu konzentrieren, während sie von einer robusten Infrastruktur und der nahtlosen Integration in moderne Cloud-Umgebungen profitieren.