Vorwort: Mit der rasanten Entwicklung der Geschäftswelt und ihrer zunehmenden Komplexität werden die Systeme fast aller Unternehmen von monolithischen zu verteilten Systemen wechseln, insbesondere zu einer Mikroservice-Architektur. Dann werden wir unweigerlich auf das Problem verteilter Transaktionen stoßen. 1. Grundlegende TheorieBevor wir die konkrete Lösung erläutern, wollen wir uns zunächst mit den theoretischen Grundlagen verteilter Transaktionen befassen. Nehmen wir als Beispiel eine Geldüberweisung. Wenn A 100 Yuan an B überweisen muss, muss der Saldo von A -100 Yuan und der von B +100 Yuan betragen. Die gesamte Überweisung muss sicherstellen, dass A-100 und B+100 gleichzeitig erfolgreich sind oder gleichzeitig fehlschlagen. Sehen wir uns an, wie dieses Problem in verschiedenen Szenarien gelöst werden kann. 1.1 TransaktionenDie Funktion, mehrere Anweisungen als Ganzes zu verarbeiten, wird als Datenbanktransaktion bezeichnet. Durch eine Datenbanktransaktion kann sichergestellt werden, dass alle Vorgänge im Rahmen der Transaktion erfolgreich sein oder fehlschlagen können. Transaktionen haben vier Eigenschaften:
Wenn unser Geschäftssystem nicht kompliziert ist und wir die Daten in einer Datenbank und einem Dienst ändern können, um die Übertragung abzuschließen, können wir Datenbanktransaktionen verwenden, um den korrekten Abschluss des Übertragungsgeschäfts sicherzustellen. 1.2 Verteilte Transaktionen Das Interbanken-Überweisungsgeschäft ist ein typisches verteiltes Transaktionsszenario. Angenommen, A muss Geld zwischen Banken an Eine verteilte Transaktion bedeutet, dass sich der Transaktionsinitiator, die Ressourcen und der Ressourcenmanager sowie der Transaktionskoordinator auf verschiedenen Knoten des verteilten Systems befinden. Im oben genannten Übertragungsvorgang befinden sich die Operationen des Benutzers Um in einer verteilten Umgebung und bei verteilten Transaktionen die Anforderungen an Verfügbarkeit, Leistung und Leistungsminderung bei Diensten zu erfüllen und die Anforderungen an Konsistenz und Isolation zu reduzieren, muss einerseits die BASE-Theorie befolgt werden (BASE-bezogene Theorien beinhalten viel Inhalt, interessierte Studierende können sich auf die BASE-Theorie beziehen):
Ebenso folgen verteilte Transaktionen teilweise der ACID-Spezifikation:
2. Verteilte Transaktionslösungen Aufgrund der verteilten Transaktionslösung ist es unmöglich, vollständige 2.1 Zweiphasiges Commit/XA XA ist eine von XA ist in zwei Phasen unterteilt:
Derzeit unterstützen die meisten gängigen Datenbanken XA-Transaktionen, darunter Eine XA-Transaktion besteht aus einem oder mehreren Ressourcenmanagern (RMs), einem Transaktionsmanager (TM) und einer
Am Beispiel der obigen Übertragung sieht das Sequenzdiagramm einer erfolgreich abgeschlossenen XA-Transaktion wie folgt aus: Wenn ein Teilnehmer Die Merkmale von XA-Transaktionen sind:
Wenn Leser 2.2 SAGA Saga ist eine in diesem Datenbankpapier Am Beispiel der obigen Übertragung sieht das Sequenzdiagramm einer erfolgreich abgeschlossenen SAGA-Transaktion wie folgt aus: Sobald Merkmale von Saga-Transaktionen:
Wenn Leser SAGA eingehender studieren möchten, können sie auf DTM zurückgreifen, das Beispiele für erfolgreiches und fehlgeschlagenes Rollback von SAGA sowie die Handhabung verschiedener Netzwerkausnahmen enthält. 2.3 TCC Das Konzept von TCC ist in 3 Phasen unterteilt:
Am Beispiel der obigen Überweisung wird der Betrag normalerweise bei „Versuchen“ eingefroren, aber nicht abgezogen, bei Das Zeitdiagramm einer erfolgreich abgeschlossenen TCC-Transaktion sieht wie folgt aus: Die Funktionen von TCC sind wie folgt:
Wenn Leser 2.4 Lokale Nachrichtentabelle Die Lösung mit der lokalen Nachrichtentabelle wurde ursprünglich vom Der allgemeine Ablauf ist wie folgt: Das Schreiben lokaler Nachrichten und Geschäftsvorgänge werden in einer Transaktion zusammengefasst, um die Atomizität von Geschäftsvorgängen und Nachrichtenversand sicherzustellen. Entweder sind sie alle erfolgreich, oder sie schlagen alle fehl. Fehlertoleranzmechanismus:
Funktionen der lokalen Nachrichtentabelle:
Gilt für Geschäfte, die asynchron ausgeführt werden können und für nachfolgende Vorgänge nicht zurückgesetzt werden müssen. 2.5 Transaktionsnachrichten Bei der oben erwähnten Lösung mit lokaler Nachrichtentabelle muss der Produzent eine zusätzliche Nachrichtentabelle erstellen und außerdem die lokale Nachrichtentabelle abfragen, was eine große geschäftliche Belastung darstellt. Alibabas Open Source Senden und Übermitteln von Transaktionsnachrichten: Nachricht senden (halbe Nachricht) Das normale Sendeflussdiagramm sieht wie folgt aus: Ablauf der Entschädigung: Für Transaktionsnachrichten ohne Die Merkmale von Transaktionsnachrichten sind wie folgt:
Gilt für Geschäfte, die asynchron ausgeführt werden können und für nachfolgende Vorgänge nicht zurückgesetzt werden müssen. 2.6 Best-Efforts-BenachrichtigungDer Initiator der Benachrichtigung verwendet einen bestimmten Mechanismus, um den Empfänger bestmöglich über die Ergebnisse der Geschäftsverarbeitung zu informieren. Dazu gehören insbesondere: Es gibt einen bestimmten Benachrichtigungsmechanismus für Nachrichtenwiederholungen. Da der Empfänger der Benachrichtigung die Benachrichtigung möglicherweise nicht erhalten hat, muss ein bestimmter Mechanismus zur Wiederholung der Nachricht vorhanden sein. Zuverlässige Nachrichtenkonsistenz: Die Partei, die die Benachrichtigung initiiert, muss sicherstellen, dass die Nachricht gesendet und an die empfangende Benachrichtigungspartei gesendet wird. Die Zuverlässigkeit der Nachricht wird hauptsächlich von der Partei gewährleistet, die die Benachrichtigung initiiert. Benachrichtigung mit bestmöglichem Aufwand: Der Initiator der Benachrichtigung bemüht sich nach besten Kräften, den Empfänger der Benachrichtigung über das Geschäftsverarbeitungsergebnis zu benachrichtigen, aber die Nachricht wird möglicherweise nicht empfangen. In diesem Fall muss der Empfänger der Benachrichtigung die Schnittstelle des Initiators aktiv aufrufen, um das Geschäftsverarbeitungsergebnis abzufragen. Die Zuverlässigkeit der Benachrichtigung hängt vom Empfänger der Benachrichtigung ab. Im Hinblick auf Lösungen erfordert die Best-Effort-Benachrichtigung:
Die Best-Effort-Benachrichtigung ist auf Geschäftsbenachrichtigungstypen anwendbar. Beispielsweise wird das Ergebnis einer WeChat-Transaktion jedem Händler durch eine Best-Effort-Benachrichtigung mitgeteilt. Es gibt Rückrufbenachrichtigungen und Transaktionsabfrageschnittstellen. 2.7 AT-TransaktionsmodusDies ist ein Transaktionsmodus im Open-Source-Projekt Seata von Alibaba, in Ant Financial auch als FMT bekannt. Der Vorteil besteht darin, dass der Transaktionsmodus ähnlich wie der XA-Modus verwendet wird. Das Unternehmen muss nicht verschiedene Kompensationsvorgänge schreiben, und das Rollback wird automatisch vom Framework abgeschlossen. Der Nachteil ist ebenfalls ähnlich wie bei XA, da es lange Sperren gibt und daher nicht für Szenarien mit hoher Parallelität geeignet ist. Aus Leistungssicht ist der AT-Modus besser als XA, bringt aber auch neue Probleme mit sich, wie beispielsweise Dirty Rollback. 3. AusnahmebehandlungIn jedem Link verteilter Transaktionen können Netzwerk- und Geschäftsfehler auftreten. Diese Probleme erfordern, dass die Geschäftspartei verteilter Transaktionen drei Funktionen implementiert: Anti-Air-Rollback, Idempotenz und Anti-Hanging. 3.1 Ungewöhnliche SituationenIm Folgenden werden diese Ausnahmen anhand von TCC-Transaktionen veranschaulicht: Leeres Rollback: Wenn die Cancel-Methode der zweiten Stufe aufgerufen wird, ohne die Try-Methode der TCC-Ressource aufzurufen, muss die Cancel-Methode erkennen, dass dies ein leeres Rollback ist, und direkt „Erfolg“ zurückgeben. Der Grund hierfür ist, dass bei einer Zweigstellentransaktion, die sich in einer Dienstausfallzeit oder Netzwerkanomalie befindet, der Aufruf der Zweigstellentransaktion als fehlgeschlagen aufgezeichnet wird. Zu diesem Zeitpunkt wird die Try-Phase nicht ausgeführt. Wenn der Fehler behoben ist, wird die verteilte Transaktion zurückgesetzt und die Cancel-Methode der zweiten Phase aufgerufen, was zu einem leeren Rollback führt. Idempotenz: Da jede Anfrage zu Netzwerkanomalien und doppelten Anfragen führen kann, müssen alle verteilten Transaktionszweige Idempotenz sicherstellen. Suspension: Suspendierung bedeutet, dass bei einer verteilten Transaktion die Der Grund hierfür ist, dass beim Aufrufen der Verzweigungstransaktion durch RPC zuerst die Verzweigungstransaktion registriert und dann der RPC-Aufruf ausgeführt wird. Wenn das Netzwerk für den RPC-Aufruf zu diesem Zeitpunkt überlastet ist, benachrichtigt TM RM nach dem RPC-Timeout, die verteilte Transaktion zurückzusetzen. Es ist möglich, dass die RPC-Anforderung von Try nach Abschluss des Rollbacks den Teilnehmer zur tatsächlichen Ausführung erreicht. Werfen wir einen Blick auf ein Zeitdiagramm von Netzwerkanomalien, um die oben genannten Probleme besser zu verstehen.
Angesichts der oben genannten komplexen Netzwerkanomalien bestehen die derzeit von verschiedenen Unternehmen empfohlenen Lösungen darin, dass die Geschäftspartei einen eindeutigen Schlüssel verwendet, um abzufragen, ob die zugehörigen Vorgänge abgeschlossen wurden, und bei Abschluss direkt eine Erfolgsmeldung zurückgibt. Die entsprechende Beurteilungslogik ist komplex, fehleranfällig und stellt eine erhebliche geschäftliche Belastung dar. 3.2 Teiltransaktionsbarriere Im Projekt https://github.com/yedf/dtm ist eine Sub-Transaktionsbarriere-Technologie entstanden. Mit dieser Technologie kann dieser Effekt erzielt werden. Siehe das schematische Diagramm: Alle diese Anfragen werden beim Erreichen der Subtransaktionsbarriere herausgefiltert, wenn sie abnormal sind, und passieren die Barriere, wenn sie normal sind. Nachdem Entwickler Subtransaktionsbarrieren verwendet haben, werden alle oben genannten Ausnahmen ordnungsgemäß behandelt. Geschäftsentwickler müssen sich nur auf die eigentliche Geschäftslogik konzentrieren, was ihre Belastung erheblich reduziert. Die Subtransaktionsbarriere stellt eine Methode namens ThroughBarrierCall bereit, deren Prototyp lautet:
Geschäftsentwickler schreiben ihre eigene zugehörige Logik in busiCall und rufen diese Funktion auf. Subtransaktionsbarrieren verwalten TCC, SAGA, Transaktionsnachrichten usw. und können auch auf andere Bereiche erweitert werden 3.3 Subtransaktionsbarriereprinzip Das Prinzip der Subtransaktionsbarrieretechnologie besteht darin, in der lokalen Datenbank eine Branch-Transaktionsstatustabelle
Mit diesem Mechanismus werden Probleme im Zusammenhang mit Netzwerkanomalien gelöst
Bei SAGA, Transaktionsnachrichten usw. ist der Mechanismus ähnlich. 3.4 Zusammenfassung der TeiltransaktionsbarrierenDie Subtransaktionsbarriere-Technologie wurde erstmals von https://github.com/yedf/dtm entwickelt. Ihre Bedeutung liegt in der Entwicklung eines einfachen und leicht zu implementierenden Algorithmus und der Bereitstellung einer einfachen und leicht zu bedienenden Schnittstelle. Mithilfe dieser beiden Elemente sind Entwickler vollständig von der Handhabung von Netzwerkausnahmen befreit. Diese Technologie muss derzeit mit dem Transaktionsmanager yedf/dtm verwendet werden. Das SDK ist derzeit für Entwickler der Sprachen Go und Python verfügbar. SDKs für weitere Sprachen sind in Planung. Für andere verteilte Transaktionsframeworks kann die Technologie gemäß den oben genannten Prinzipien schnell implementiert werden, solange entsprechende verteilte Transaktionsinformationen bereitgestellt werden. 4. Praxis der verteilten TransaktionenWir nehmen die zuvor vorgestellte SAGA-Transaktion als Beispiel und verwenden DTM als Transaktionsrahmen, um eine bestimmte verteilte Transaktion abzuschließen. In diesem Beispiel wird die Sprache Go verwendet. Wenn dich das nicht interessiert, kannst du direkt zur Zusammenfassung am Ende des Artikels springen. 4.1 Eine SAGA-TransaktionSchreiben wir zunächst den Kerngeschäftscode, um den Kontostand des Benutzers anzupassen Funktion qsAdjustBalance(uid int, Betrag int) (Schnittstelle{}, Fehler) { _, err := dtmcli.SdbExec(sdbGet(), "aktualisiere dtm_busi.user_account, setze Guthaben = Guthaben + ? wobei user_id = ?", Betrag, uid) returniere dtmcli.ResultSuccess, err } Als nächstes schreiben wir eine spezifische Verarbeitungsfunktion für Vorwärtsoperationen/Kompensationsoperationen app.POST(qsBusiAPI+"/TransIn", common.WrapHandler(func(c *gin.Context) (Schnittstelle{}, Fehler) { Rückgabewert qsAdjustBalance(2, 30) })) app.POST(qsBusiAPI+"/TransInCompensate", common.WrapHandler(func(c *gin.Context) (Schnittstelle{}, Fehler) { gibt qsAdjustBalance(2, -30) zurück })) app.POST(qsBusiAPI+"/TransOut", common.WrapHandler(func(c *gin.Context) (Schnittstelle{}, Fehler) { gibt qsAdjustBalance(1, -30) zurück })) app.POST(qsBusiAPI+"/TransOutCompensate", common.WrapHandler(func(c *gin.Context) (Schnittstelle{}, Fehler) { Rückgabewert qsAdjustBalance(1, 30) })) Zu diesem Zeitpunkt waren die Verarbeitungsfunktionen jeder Untertransaktion in Ordnung. Anschließend wird die SAGA-Transaktion geöffnet, um Zweigstellenaufrufe durchzuführen. req := &gin.H{"amount": 30} // Microservice-Nutzlast // DtmServer ist die Adresse der DTM-Dienst-Saga := dtmcli.NewSaga(DtmServer, dtmcli.MustGenGid(DtmServer)). // Fügen Sie eine TransOut-Untertransaktion hinzu. Die Vorwärtsoperation ist url: qsBusi+"/TransOut", und die Rückwärtsoperation ist url: qsBusi+"/TransOutCompensate" Hinzufügen(qsBusi+"/TransOut", qsBusi+"/TransOutCompensate", erforderlich). // Fügen Sie eine TransIn-Untertransaktion hinzu. Die Vorwärtsoperation ist url: qsBusi+"/TransOut", und die Rückwärtsoperation ist url: qsBusi+"/TransInCompensate" Hinzufügen(qsBusi+"/TransIn", qsBusi+"/TransInCompensate", erforderlich) //Senden Sie die Saga-Transaktion, DTM wird alle Untertransaktionen abschließen/alle Untertransaktionen zurücksetzen err := saga.Submit() An diesem Punkt wurde eine vollständige verteilte SAGA-Transaktion geschrieben. Wenn Sie ein erfolgreiches Beispiel vollständig ausführen möchten, richten Sie die Umgebung gemäß den Anweisungen des yedf/dtm-Projekts ein und führen Sie das Saga-Beispiel mit dem folgenden Befehl aus:
4.2 Umgang mit NetzwerkanomalienWas soll ich tun, wenn beim Aufrufen der Übertragungsoperation in einer an dtm übermittelten Transaktion ein kurzer Fehler auftritt? Gemäß dem SAGA-Transaktionsprotokoll wird dtm nicht abgeschlossene Vorgänge wiederholen. Was sollten wir jetzt tun? Der Fehler kann ein Netzwerkfehler nach Abschluss des Übertragungsvorgangs sein oder es kann vorkommen, dass der Computer während des Übertragungsvorgangs abstürzt. Wie können wir sicherstellen, dass die Anpassung des Kontostands korrekt ist? Wir verwenden die Subtransaktionsbarrierefunktion, um sicherzustellen, dass nach mehreren Wiederholungsversuchen nur eine erfolgreiche Übermittlung erfolgt. Wir passen die Verarbeitungsfunktion an: Funktion sagaBarrierAdjustBalance(sdb *sql.Tx, uid int, amount int) (Schnittstelle{}, Fehler) { _, err := dtmcli.StxExec(sdb, "aktualisiere dtm_busi.user_account, setze Guthaben = Guthaben + ? wobei Benutzer-ID = ?", Betrag, UID) returniere dtmcli.ResultSuccess, err } Funktion sagaBarrierTransIn(c *gin.Context) (Schnittstelle{}, Fehler) { return dtmcli.ThroughBarrierCall(sdbGet(), MustGetTrans(c), func(sdb *sql.Tx) (Schnittstelle{}, Fehler) { gibt sagaBarrierAdjustBalance(sdb, 1, reqFrom(c).Betrag) zurück }) } Funktion sagaBarrierTransInCompensate(c *gin.Context) (Schnittstelle{}, Fehler) { return dtmcli.ThroughBarrierCall(sdbGet(), MustGetTrans(c), func(sdb *sql.Tx) (Schnittstelle{}, Fehler) { gibt sagaBarrierAdjustBalance(sdb, 1, -reqFrom(c).Betrag) zurück }) } Der Aufruf Sie können mehrmals versuchen, diesen TransIn-Dienst anzurufen, und der Saldo wird nur einmal angepasst. Sie können den neuen Prozess ausführen, indem Sie den folgenden Befehl ausführen: 4.3 Rollback-BehandlungWas passiert, wenn die Bank bei der Vorbereitung der Überweisung des Betrags an Benutzer 2 eine Anomalie auf dem Konto von Benutzer 2 feststellt und eine Fehlermeldung meldet? Wir passen die Verarbeitungsfunktion so an, dass der Übertragungsvorgang einen Fehler zurückgibt Funktion sagaBarrierTransIn(c *gin.Context) (Schnittstelle{}, Fehler) { returniere dtmcli.ResultFailure, nil } Wir geben ein Zeitdiagramm der Interaktion zwischen Transaktionsfehlern Hier gibt es eine Sache. Der Vorwärtsvorgang von Keine Sorge. Die vorherige Subtransaktionsbarrieretechnologie kann sicherstellen, dass die Kompensation ein No-Op ist, wenn Sie können das TransIn, das einen Fehler zurückgibt, wie folgt ändern: Funktion sagaBarrierTransIn(c *gin.Context) (Schnittstelle{}, Fehler) { dtmcli.ThroughBarrierCall(sdbGet(), MustGetTrans(c), Funktion(sdb *sql.Tx) (Schnittstelle{}, Fehler) { Rückgabewert für sagaBarrierAdjustBalance(sdb, 1, 30) }) returniere dtmcli.ResultFailure, nil } Das Endergebnis ist, dass die Bilanz immer noch in Ordnung ist 5. ZusammenfassungDieser Artikel stellt einige grundlegende Theorien zu verteilten Transaktionen vor und erläutert häufig verwendete Lösungen für verteilte Transaktionen. Die zweite Hälfte des Artikels enthält außerdem die Ursachen, Klassifizierungen und eleganten Lösungen für Transaktionsausnahmen. Abschließend wird ein ausführbares Beispiel für verteilte Transaktionen verwendet, um den zuvor eingeführten Inhalt in einem kurzen Programm zu demonstrieren. Dies ist das Ende dieses Artikels über die sieben klassischen Lösungen für verteilte MySQL- und Golan-Transaktionen. Weitere Informationen zu den sieben klassischen Lösungen für verteilte Transaktionen finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen! Das könnte Sie auch interessieren:
|
<<: Vue implementiert Beispielcode für benutzerdefinierte „modales Popup-Fenster“-Komponente
Dieser Artikel stellt ein Beispiel vor, wie man m...
Wenn wir die LNPM-Serverumgebung installieren und...
Die Datenintegrität wird in Entitätsintegrität, D...
Um den blinkenden Hintergrundfarbeffekt zu erziele...
Die stabile Version (GA) von MySQL 8.0.18 wurde g...
Heute habe ich in diesem Artikel 30 hervorragende ...
Was ist Routing? Unter Routing versteht man die Ü...
1. Die chinesischen verstümmelten Zeichen erschei...
Inhaltsverzeichnis 1. Ternäres Operatorurteil 2. ...
Inhaltsverzeichnis 1. Schreiben Sie ein HTML, das...
Dieses Tutorial beschreibt die Installation der M...
Spezifische Methode: (Empfohlenes Tutorial: Lern-...
Inhaltsverzeichnis Vorwort: Schritt 1: Finden Sie...
Dieser Artikel beschreibt hauptsächlich die Auswi...
Hinzufügen einer Netzwerkschnittstelle zum Contai...