Saga (Entwurfsmuster)
# Saga (Entwurfsmuster)

Saga (englisch saga pattern) ist ein Entwurfsmuster aus dem Bereich der Softwareentwicklung zur Verwaltung von Daten in verteilten Systemen, häufig genutzt bei der Implementierung von Microservices. Saga kann in einem verteilten System die Transaktion ersetzen.

## Verwendung

In einer serviceorientierten Architektur sind die Services für die Persistenz ihrer Daten verantwortlich. Das führt zu mehreren unabhängigen Datenablagen im verteilten System. Dennoch benötigen bestimmte Anwendungsfälle eine Folge von Operationen, basierend auf mehreren Services mit Persistenz, die nur komplett oder gar nicht durchgeführt werden dürfen. Dies wurde traditionell in Datenbankmanagementsystem über Transaktion gelöst.

Beim Saga-Ansatz existiert zu jeder Operation eine Kompensationsoperation. Die Operationen werden als Workflow aufgefasst, die je nach Anwendungslogik parallel oder sequenziell ausgeführt werden. Wird bei der Ausführung eine Operation fehlerhaft abgeschlossen, werden alle bereits erfolgreich ausgeführten Operationen durch die zugeordneten Kompensationsoperationen rückgängig gemacht, um das System wieder in den konsistenten Ausgangszustand zu bringen.

## Beispiel

Im Beispiel Reisebuchung können Hotel-, Auto- und Flugbuchungen über verschiedene, unabhängige Services erfolgen. Es handelt sich also um keine Transaktion, sondern um einen betriebswirtschaftlichen Vorgang. Es gibt die Operationen Buche Hotel, Buche Leihwagen und Buche Flug sowie die Kompensationsoperationen Storniere Flug, Storniere Leihwagen und Storniere Hotel.

Wenn die Flugbuchung nicht erfolgreich durchgeführt werden kann, müssen Hotel und Auto storniert werden. Im Sequenzdiagramm wird davon ausgegangen, dass auch die nicht erfolgreiche Flugbuchung storniert werden muss, diese ist aber vom genutzten Service abhängig. Je nachdem an welcher Stelle des Arbeitsablaufs ein Fehler auftritt können unterschiedliche Kompensationsoperationen notwendig werden.

