Dies ist eine klassische Frage, die mir kürzlich während eines Interviews gestellt wurde. Wie rufe ich mehrere Webdienste auf und behalte trotzdem eine Art Fehlerbehandlung mitten in der Aufgabe bei? Heutzutage vermeiden wir beim Hochleistungsrechnen Zweiphasen-Commits. Ich habe vor vielen Jahren eine Zeitung über das sogenannte "Starbuck-Modell" für Transaktionen gelesen: Denken Sie an den Prozess des Bestellens, Bezahlens, Zubereitens und Empfangens des bei Starbuck bestellten Kaffees ... Ich vereinfache die Dinge zu stark, aber ein Zwei-Phasen-Commit-Modell würde dies tun Schlagen Sie vor, dass der gesamte Prozess eine einzige Verpackungstransaktion für alle erforderlichen Schritte ist, bis Sie Ihren Kaffee erhalten. Bei diesem Modell würden jedoch alle Mitarbeiter warten und aufhören zu arbeiten, bis Sie Ihren Kaffee erhalten. Siehst du das bild
Stattdessen ist das "Starbuck-Modell" produktiver, indem es dem "Best-Effort" -Modell folgt und Fehler im Prozess kompensiert. Erstens sorgen sie dafür, dass Sie bezahlen! Dann gibt es Nachrichtenwarteschlangen mit Ihrer Bestellung, die an die Tasse angehängt sind. Wenn dabei etwas schief geht, wie Sie Ihren Kaffee nicht bekommen haben, es nicht das ist, was Sie bestellt haben usw., treten wir in den Vergütungsprozess ein und stellen sicher, dass Sie das bekommen, was Sie wollen oder Sie erstatten. Dies ist das effizienteste Modell für mehr Produktivität.
Manchmal verschwendet Starbucks einen Kaffee, aber der Gesamtprozess ist effizient. Es gibt andere Tricks, die Sie beim Erstellen Ihrer Webdienste berücksichtigen sollten, z. B. das Entwerfen so, dass sie beliebig oft aufgerufen werden können und dennoch das gleiche Endergebnis liefern. Meine Empfehlung lautet also:
Seien Sie bei der Definition Ihrer Webdienste nicht zu fein (ich bin nicht überzeugt von dem heutigen Hype um Mikrodienste: zu viele Risiken, zu weit zu gehen);
Async erhöht die Leistung. Ziehen Sie es daher vor, asynchron zu sein. Senden Sie Benachrichtigungen nach Möglichkeit per E-Mail.
Erstellen Sie intelligentere Services, um sie beliebig oft "abrufbar" zu machen, und verarbeiten Sie sie mit einer UID oder TaskID, die bis zum Ende der Reihenfolge von unten nach oben folgt, und validieren Sie die Geschäftsregeln in jedem Schritt.
Verwenden Sie Nachrichtenwarteschlangen (JMS oder andere) und leiten Sie zu Fehlerbehandlungsprozessoren um, die Operationen auf "Rollback" anwenden, indem Sie entgegengesetzte Operationen anwenden. Übrigens erfordert das Arbeiten mit asynchroner Reihenfolge eine Art Warteschlange, um den aktuellen Status des Prozesses zu überprüfen. also bedenke das;
Stellen Sie es als letztes Mittel (da es möglicherweise nicht häufig vorkommt) in eine Warteschlange, um Fehler manuell zu verarbeiten.
Kehren wir zum ursprünglichen Problem zurück, das veröffentlicht wurde. Erstellen Sie ein Konto und eine Brieftasche und stellen Sie sicher, dass alles erledigt wurde.
Angenommen, ein Webdienst wird aufgerufen, um den gesamten Vorgang zu orchestrieren.
Der Pseudocode des Webdienstes würde folgendermaßen aussehen:
Rufen Sie den Microservice zur Kontoerstellung auf, übergeben Sie ihm einige Informationen und eine eindeutige Aufgaben-ID. 1.1 Der Microservice zur Kontoerstellung prüft zunächst, ob dieses Konto bereits erstellt wurde. Dem Kontoeintrag ist eine Aufgaben-ID zugeordnet. Der Microservice erkennt, dass das Konto nicht vorhanden ist, erstellt es und speichert die Task-ID. HINWEIS: Dieser Dienst kann 2000 Mal aufgerufen werden und führt immer das gleiche Ergebnis aus. Der Dienst antwortet mit einer "Quittung, die nur minimale Informationen enthält, um bei Bedarf einen Rückgängig-Vorgang auszuführen".
Rufen Sie die Wallet-Erstellung auf und geben Sie die Konto-ID und die Aufgaben-ID an. Angenommen, eine Bedingung ist ungültig und die Brieftaschenerstellung kann nicht durchgeführt werden. Der Aufruf wird mit einem Fehler zurückgegeben, es wurde jedoch nichts erstellt.
Der Orchestrator wird über den Fehler informiert. Es weiß, dass es die Kontoerstellung abbrechen muss, aber es wird es nicht selbst tun. Der Brieftaschendienst wird aufgefordert, dies zu tun, indem er die am Ende von Schritt 1 erhaltene "minimale Rückgängig-Quittung" weiterleitet.
Der Kontodienst liest die Rückgängig-Quittung und weiß, wie der Vorgang rückgängig gemacht werden kann. Die Rückgängig-Quittung kann sogar Informationen über einen anderen Mikrodienst enthalten, den sie möglicherweise selbst aufgerufen hat, um einen Teil des Auftrags auszuführen. In diesem Fall kann der Rückgängig-Beleg die Konto-ID und möglicherweise einige zusätzliche Informationen enthalten, die für die Ausführung des umgekehrten Vorgangs erforderlich sind. In unserem Fall löschen wir das Konto zur Vereinfachung einfach mit seiner Konto-ID.
Angenommen, der Webdienst hat (in diesem Fall) nie den Erfolg oder Misserfolg erhalten, dass das Rückgängigmachen der Kontoerstellung durchgeführt wurde. Der Rückgängig-Dienst des Kontos wird einfach erneut aufgerufen. Und dieser Dienst sollte normalerweise niemals fehlschlagen, da sein Ziel darin besteht, dass das Konto nicht mehr existiert. Es prüft also, ob es existiert und sieht, dass nichts getan werden kann, um es rückgängig zu machen. Es wird also zurückgegeben, dass die Operation ein Erfolg ist.
Der Webdienst gibt an den Benutzer zurück, dass das Konto nicht erstellt werden konnte.
Dies ist ein synchrones Beispiel. Wir hätten es auf andere Weise verwalten und den Fall in eine Nachrichtenwarteschlange stellen können, die auf den Helpdesk ausgerichtet ist, wenn wir nicht möchten, dass das System den Fehler vollständig behebt. "Ich habe gesehen, dass dies in einem Unternehmen durchgeführt wird, in dem dies nicht ausreicht Das Back-End-System konnte mit Hooks versehen werden, um Situationen zu korrigieren. Der Helpdesk erhielt Nachrichten, die enthielten, was erfolgreich ausgeführt wurde, und verfügte über genügend Informationen, um Probleme zu beheben, für die unser Rückgängig-Beleg vollautomatisch verwendet werden konnte.
Ich habe eine Suche durchgeführt und die Microsoft-Website enthält eine Musterbeschreibung für diesen Ansatz. Es wird das kompensierende Transaktionsmuster genannt:
Ausgleich des Transaktionsmusters