Heim  >  Artikel  >  Backend-Entwicklung  >  Bringen Sie Ihnen Schritt für Schritt bei, wie Sie mit PHP eine verteilte TCC-Transaktion abschließen

Bringen Sie Ihnen Schritt für Schritt bei, wie Sie mit PHP eine verteilte TCC-Transaktion abschließen

藏色散人
藏色散人nach vorne
2021-09-22 15:32:394178Durchsuche

TCC-ZusammensetzungTCC ist in 3 Phasen unterteilt Wenn der Versuch erfolgreich ist, geht es zur Bestätigungsphase über. Bestätigen führt das Geschäft tatsächlich aus, führt keine Geschäftsprüfungen durch und verwendet nur die in der Try-Phase reservierten Geschäftsressourcen. Abbrechen-Phase: Wenn einer der Versuche aller Zweige fehlschlägt, geht es in die Abbrechen-Phase. Abbrechen gibt die in der Testphase reservierten Geschäftsressourcen frei.

Es gibt drei Rollen in verteilten TCC-Transaktionen, die mit klassischen verteilten XA-Transaktionen identisch sind:
  • AP/Anwendung, die globale Transaktionen initiiert und definiert, welche Transaktionszweige die globale Transaktion umfasst
  • RM/Ressourcenmanager, Verantwortlicher für die Verwaltung verschiedener Ressourcen von Filialtransaktionen
  • TM/Transaktionsmanager, verantwortlich für die Koordinierung der korrekten Ausführung globaler Transaktionen, einschließlich der Ausführung von Bestätigen und Abbrechen, und der Behandlung von Netzwerkausnahmen

Wenn wir ein ähnliches Geschäft abwickeln möchten Interbank-Überweisungen, Überweisungen (TransOut) und Überweisungen (TransIn) erfolgen jeweils in unterschiedlichen Microservices. Das typische Sequenzdiagramm einer erfolgreich abgeschlossenen TCC-Transaktion sieht wie folgt aus:
  • TCC-Praxis

Weiter Wir werden eine TCC-Transaktion durchführen. Spezifische Entwicklung

Das derzeit für TCC verfügbare Open-Source-Framework ist hauptsächlich die Java-Sprache, dargestellt durch Seata. Unser Beispiel verwendet NodeJS und das verwendete Framework für verteilte Transaktionen ist DTM, das verteilte Transaktionen sehr elegant unterstützt. Lassen Sie uns die Zusammensetzung von TCC im Detail erklärenBringen Sie Ihnen Schritt für Schritt bei, wie Sie mit Bringen Sie Ihnen Schritt für Schritt bei, wie Sie mit PHP eine verteilte TCC-Transaktion abschließen eine verteilte TCC-Transaktion abschließen

Jetzt schreiben wir die spezifische Verarbeitungsfunktion „Try/Confirm/Cancel“

$vega->handleFunc('/api/TransOutTry', function (Mix\Vega\Context $ctx) {
    var_dump('TransOutTry', $ctx->request->getQueryParams(), $ctx->request->getParsedBody());
    $ctx->JSON(200, ['result' => 'SUCCESS']);})->methods('POST');$vega->handleFunc('/api/TransOutConfirm', function (Mix\Vega\Context $ctx) {
    var_dump('TransOutConfirm', $ctx->request->getQueryParams(), $ctx->request->getParsedBody());
    $ctx->JSON(200, ['result' => 'SUCCESS']);})->methods('POST');$vega->handleFunc('/api/TransOutCancel', function (Mix\Vega\Context $ctx) {
    var_dump('TransOutCancel', $ctx->request->getQueryParams(), $ctx->request->getParsedBody());
    $ctx->JSON(200, ['result' => 'SUCCESS']);})->methods('POST');$vega->handleFunc('/api/TransInTry', function (Mix\Vega\Context $ctx) {
    var_dump('TransInTry', $ctx->request->getQueryParams(), $ctx->request->getParsedBody());
    $ctx->JSON(200, ['result' => 'SUCCESS']);})->methods('POST');$vega->handleFunc('/api/TransInConfirm', function (Mix\Vega\Context $ctx) {
    var_dump('TransInConfirm', $ctx->request->getQueryParams(), $ctx->request->getParsedBody());
    $ctx->JSON(200, ['result' => 'SUCCESS']);})->methods('POST');$vega->handleFunc('/api/TransInCancel', function (Mix\Vega\Context $ctx) {
    var_dump('TransInCancel', $ctx->request->getQueryParams(), $ctx->request->getParsedBody());
    $ctx->JSON(200, ['result' => 'SUCCESS']);})->methods('POST');
An diesem Punkt sind die Verarbeitungsfunktionen jeder Untertransaktion in Ordnung, starten dann die TCC-Transaktion und führen Verzweigungsaufrufe durch
    Dtmcli\tccGlobalTransaction($dtm, function ($tcc) use ($svc) {
        /** @var Dtmcli\Tcc $tcc */
        $req = ['amount' => 30];
        $tcc->callBranch($req, $svc . '/TransOutTry', $svc . '/TransOutConfirm', $svc . '/TransOutCancel');
        $tcc->callBranch($req, $svc . '/TransInTry', $svc . '/TransInConfirm', $svc . '/TransInCancel');
    });

An diesem Punkt ist eine vollständige verteilte TCC-Transaktion abgeschlossen.

Wenn Sie ein erfolgreiches Beispiel vollständig ausführen möchten, dann schauen Sie sich dieses Beispiel yedf/dtmcli-php-sample an, es ist sehr einfach auszuführen

# 部署启动dtm# 需要docker版本18以上git clone https://github.com/yedf/dtmcd dtm
docker-compose up# 另起一个命令行https://github.com/yedf/dtmcli-php-sample.gitcd dtmcli-php-sample
composer installphp demo.php start

Rollback von TCC

Wenn die Bank die Überweisung des Betrags vorbereitet an den Benutzer Um 2 Uhr wird festgestellt, dass das Konto von Benutzer 2 abnormal ist und die Rückgabe fehlschlägt. Wir können diese Situation simulieren, indem wir TransIn einen Fehler zurückgeben lassen Rufen Sie den Abbruchvorgang jeder Untertransaktion auf, um sicherzustellen, dass alle globalen Transaktionen zurückgesetzt werden.

Im TCC-Transaktionsmodus werden sich viele Leser fragen: Was passiert, wenn Bestätigen/Abbrechen fehlschlägt? Das ist eine gute Frage, denn sie bedeutet, dass Sie intensiv über das TCC-Transaktionsmodell nachdenken. Der erste Fall ist ein vorübergehender Fehler, wie z. B. ein Netzwerkausfall, eine Anwendungs- oder Datenbankunterbrechung, und der andere Fall ist ein Geschäftsausfall Erste Stufe, um sicherzustellen, dass ausreichende Ressourcen die Ausführung von „Bestätigen/Abbrechen“ ermöglichen. Mit anderen Worten: Bestätigen/Abbrechen darf nicht zu einem Geschäftsfehler führen, und die Entwickler müssen dies tun Beheben Sie den Fehler manuell.

Zusammenfassung

In diesem Artikel haben wir das theoretische Wissen von TCC vorgestellt und außerdem anhand eines Beispiels einen vollständigen Prozess zum Schreiben einer TCC-Transaktion dargestellt, der den normalen erfolgreichen Abschluss und den erfolgreichen Rollback abdeckt. Ich glaube, dass die Leser durch diesen Artikel ein tiefes Verständnis von TCC erlangen.

Weitere Informationen zu verteilten Transaktionen finden Sie unter „

Die sieben klassischsten Lösungen für verteilte Transaktionen

Bringen Sie Ihnen Schritt für Schritt bei, wie Sie mit Bringen Sie Ihnen Schritt für Schritt bei, wie Sie mit PHP eine verteilte TCC-Transaktion abschließen eine verteilte TCC-Transaktion abschließenDie in diesem Artikel verwendeten Beispiele sind Auszüge aus yedf/dtm (https://github.com/yedf / dtm) unterstützt es mehrere Transaktionsmodi: TCC, SAGA, .pub/summary/code.html#go). Bietet eine Barrierefunktion für Untertransaktionen, um Probleme wie Idempotenz, Aussetzung und Nullkompensation elegant zu lösen.

Nachdem Sie diesen Artikel gelesen haben, können Sie gerne das Projekt github.com/yedf/dtm besuchen und einen Stern vergeben, um es zu unterstützen!

Das obige ist der detaillierte Inhalt vonBringen Sie Ihnen Schritt für Schritt bei, wie Sie mit PHP eine verteilte TCC-Transaktion abschließen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:learnku.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen