Was macht spring-boot-saga-pattern?
Bietet verteilte Transaktionsmuster mit dem Saga-Pattern für Spring Boot Microservices. Verwenden Sie es, wenn Sie verteilte Transaktionen über Dienste hinweg implementieren, kompensierende Transaktionen behandeln, letztendliche Konsistenz sicherstellen oder Choreographie- bzw. Orchestrierungs-basierte Sagas mit Kafka, RabbitMQ oder Axon Framework aufbauen möchten.
Überblick
Dieses Projekt implementiert das Saga-Entwurfsmuster für Spring Boot Microservices. Es unterstützt zwei gängige Ansätze:
- Choreographie-basierte Sagas: Ereignisgesteuerte Kommunikation, bei der jeder Dienst lokale Transaktionen ausführt und Ereignisse veröffentlicht, die andere Dienste abonnieren.
- Orchestrierungs-basierte Sagas: Ein zentraler Orchestrator koordiniert die Ausführung von Schritten und ruft bei Bedarf kompensierende Aktionen auf.
Verwendung
- Abhängigkeit einbinden: Fügen Sie die entsprechende Abhängigkeit zu Ihrer
pom.xmloderbuild.gradlehinzu (siehe Dokumentation). - Konfigurieren: Definieren Sie Saga-Schritte und kompensierende Aktionen gemäß der API.
- Messen wählen: Stellen Sie den Nachrichtenbroker (Kafka, RabbitMQ) oder das Axon Framework als Event-Transport ein.
- Ausführen: Starten Sie Ihre Microservices – die Saga wird automatisch auf der Grundlage der Konfiguration orchestriert oder choreographisch ausgeführt.
Unterstützte Plattformen
- Kafka: Für zuverlässige, persistente Ereignisströme.
- RabbitMQ: Für sorgenfreie Nachrichtenweiterleitung und Warteschlangen.
- Axon Framework: Für das ereignisgesteuerte Microservices-Framework mit integrierter Saga-Unterstützung.
Funktionsweise
- Saga-Definition: Entwickler definieren Schritte als Methoden, die von
@SagaStepannotiert werden. - Ausführung: Die Laufzeitumgebung führt die Schritte nacheinander aus und zeichnet den Status jedes Schrittes auf.
- Kompensation: Bei Fehlschlag eines Schrittes werden die zuvor abgeschlossenen Schritte rückgängig gemacht (kompensiert).
- Zustandsverwaltung: Der aktuelle Saga-Status wird in einem persistenten Speicher (z. B. Datenbank) gehalten, um Ausfälle zu überstehen.
Beispiel
@Saga
public class BestellSaga {
@SagaStep(compensationMethod = "storniereReservierung")
public void reserviereBestand(Bestellung bestellung) {
// Bestand reservieren
}
public void storniereReservierung(Bestellung bestellung) {
// Reservierung stornieren
}
@SagaStep(compensationMethod = "storniereZahlung")
public void verarbeiteZahlung(Bestellung bestellung) {
// Zahlung verarbeiten
}
public void storniereZahlung(Bestellung bestellung) {
// Zahlung stornieren
}
}
Weiterführende Informationen
Weitere Details finden Sie in der offiziellen Dokumentation des Projekts oder in den Beispielimplementierungen im Repository.