myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Rund um die Programmierung » Wie kann ich in einer Microservice-Struktur aufeinanderfolgende Abläufe failsafe aufsetzen?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Wie kann ich in einer Microservice-Struktur aufeinanderfolgende Abläufe failsafe aufsetzen?

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
emuuu
myCSharp.de-Mitglied

avatar-4078.jpg


Dabei seit: 04.02.2011
Beiträge: 255


emuuu ist offline

Wie kann ich in einer Microservice-Struktur aufeinanderfolgende Abläufe failsafe aufsetzen?

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Guten Tag zusammen,

ich habe mal eine Frage wie ich in einer Microservice-Struktur mehrere aufeinanderfolgende Abläufe failsafe aufsetzen kann.

Wenn ich mir einen monolitischen Service, der mit einer Datenbank läuft vorstelle, starte ich eine Transaction und führe meine drei DB-Zugriffe aus: SELECT A, INSERT B, UPDATE C.

Wenn jetzt C aus irgend einem Grund scheitert, habe ich in B eine Entity die da nicht hingehört, weil der ganze Request gescheitert ist und der B nicht in C referenziert wurde.
Im o.g. Beispiel würde ich ein Rollback für die Transaction durchführen und das Thema ist gegessen.

Im Microservice-Ansatz sind A, B & C eigene Services mit eigenen DBs:
Gibt es hierfür einen ähnlich einfachen Ansatz wie Transactions oder bleibt mir nichts anderes als im API-Gateway, dass die Microservices aufruft selber dafür zu sorgen, dass aufgeräumt wird (z.B: catch Exception -> DELETE B -> was mache ich wenn hier auch ein Fehler auftritt weil die DB gerade nen Problem hat)?

Beste Grüße
emuuu
Neuer Beitrag 15.03.2020 08:55 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.966
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Prinzipiell verfolgt man bei Microservices in den aller meisten Fällen das Prinzip von Event Sourcing - und verfolgt daher meistens Eventual Consistency.
Der Pattern dazu nennt sich  Saga (Entwurfsmuster).

Die Alternative nennt sich Multi Phase Commit (oder auch Two Phase Commit).
Hier gibt es eine zusätziche Schicht (Coordinator genannt), der die einzelnen Steps der Transaction ausführt und überwacht.

Letzteres kenne ich persönlich nur aus der Theorie; noch nie wirklich gesehen oder angewendet.
Neuer Beitrag 15.03.2020 15:23 Beiträge des Benutzers | zu Buddylist hinzufügen
emuuu
myCSharp.de-Mitglied

avatar-4078.jpg


Dabei seit: 04.02.2011
Beiträge: 255

Themenstarter Thema begonnen von emuuu

emuuu ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Zitat von Abt:
Der Pattern dazu nennt sich  Saga (Entwurfsmuster).

Super danke. Das entspricht ja in etwa meinem "selber dafür sorgen, dass aufgeräumt wird".

Wäre das im Code eine korrekt Umsetzung:

C#-Code:
public aync Task DoStuff()
{
var compensationTasks = new List<Task>();

try
{

var resultFromA = await _dataService.CallServiceA();
compensationTasks.Add(CompensateServiceA());

var resultFromB = await _dataService.CallServiceB(resultFromA);
compensationTasks.Add(CompensateServiceB(resultFromB));


var resultFromC = await _dataService.CallServiceC(resultFromA, resultFromB);
compensationTasks.Add(CompensateServiceC());

}
catch (Exception)
{
Task.WaitAll(compensationTasks.ToArray());
}

}

Würde das aber nicht die Komplexität um einen nicht unerheblichen Faktor nach oben schrauben?
Neuer Beitrag 16.03.2020 14:46 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Abt
myCSharp.de-Team

avatar-4119.png


Dabei seit: 20.07.2008
Beiträge: 13.966
Herkunft: Stuttgart/Stockholm


Abt ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Dein Code ist ganz ganz ganz weit weg von SAGA oder Event Sourcing.
Bei Event Sourcing gibt es keine Direct Calls. Hier arbeitet man mit Events.

Das heisst man hätte pro Business Case entsprechend einen Topic, auf den dann zB. eine Order abgesetzt werden soll.
Klappt das nicht, gibt es einen entsprechenden Error Topic / eine Error Message, auf die dann wiederum jemand anderes hören kann, um eine Stornierung zu triggern.

Was Du da im Code hast ist weit weit weg von irgendwelchen Event-Ideen; das ist eher Multi Phase Commit.

Aber ja, wenn Du alles von einem Service aus koordinierst und auch noch behandeln musst, dann ist das eine sehr hohe Komplexität.
Microservices sind aber nicht unbedingt da, nur alles simpel zu machen - sondern vor allem um die Abhängigkeiten zu lösen und skalieren zu können.
Die wenigsten Umgebungen brauchen aber "echte" Microservices wirklich. Gibt auch viel Bullshit-Clickbait-Videos derzeit leider dazu.
Neuer Beitrag 16.03.2020 14:58 Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 3 Monate.
Der letzte Beitrag ist älter als 3 Monate.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 14.07.2020 11:34