Heim  >  Artikel  >  Backend-Entwicklung  >  [DTM] Die Betaversion des PHP-Coroutine-Clients v0.1 ist veröffentlicht!

[DTM] Die Betaversion des PHP-Coroutine-Clients v0.1 ist veröffentlicht!

藏色散人
藏色散人nach vorne
2022-02-15 15:19:484315Durchsuche

Gute Neuigkeiten! DTM Distributed Transaction Manager PHP Coroutine Client v0.1 Betaversion veröffentlicht! ! !
→ github.com/dtm-php/dtm-client

Einführung

dtm/dtm-client ist der PHP-Client des Distributed Transaction Manager DTM, der bereits den TCC-Modus, Saga und zweiphasige Nachrichten unterstützt Modus. Verteilter Transaktionsmodus und realisiert die Kommunikation mit dem DTM-Server über das HTTP-Protokoll bzw. das gRPC-Protokoll. Der Client kann sicher in PHP-FPM- und Swoole-Coroutine-Umgebungen ausgeführt werden und bietet außerdem benutzerfreundlichere funktionale Unterstützung für Hyperf. [Empfohlen: PHP-Video-Tutorial]

Über DTM

DTM ist ein verteilter Open-Source-Transaktionsmanager, der auf der Go-Sprache basiert und leistungsstarke Funktionen zum Kombinieren von Transaktionen über Sprachen und Speicher-Engines hinweg bietet. DTM löst auf elegante Weise verteilte Transaktionsprobleme wie Idempotenz, Nullkompensation und Aussetzung und bietet außerdem eine einfach zu verwendende, leistungsstarke und einfach horizontal erweiterbare Lösung für verteilte Transaktionen.

Highlights

  • Einfacher Einstieg
    • Startdienst ohne Konfiguration, der eine sehr einfache HTTP-Schnittstelle bietet und die Schwierigkeit beim Einstieg in verteilte Transaktionen erheblich reduziert
  • Sprachübergreifend
    • Geeignet für Unternehmen mit mehreren -Sprachstapel. Bequeme Verwendung von Go, Python, PHP, NodeJs, Ruby, C# und anderen Sprachen.
  • Einfach zu verwenden
    • Entwickler müssen sich keine Sorgen mehr über verschiedene Probleme wie Hängenbleiben, Nullkompensation, Potenzierung usw. machen. Die erste Subtransaktionsbarriere-Technologie erledigt das für Sie
  • Einfach bereitzustellen und zu erweitern
    • Nur basiert auf MySQL/Redis, einfache Bereitstellung, einfach zu gruppieren, einfach horizontal zu erweitern
  • Unterstützung mehrerer verteilter Transaktionsprotokolle
    • TCC, SAGA,

Vergleich In Nicht-Java-Sprachen gibt es außer DTM keinen ausgereiften verteilten Transaktionsmanager, daher hier ein Vergleich zwischen DTM und Seata, dem ausgereiftesten Open-Source-Projekt in Java:

Komplexe ZustandsmaschineAnzahl der Sterne

Den oben verglichenen Merkmalen nach zu urteilen, hat DTM in vielerlei Hinsicht große Vorteile. Wenn Sie mehrsprachige Unterstützung und Multi-Storage-Engine-Unterstützung in Betracht ziehen, ist DTM zweifellos Ihre erste Wahl.

Installation

Die Installation des DTM-Clients über Composer ist sehr praktisch der DTM-Server, wenn er verwendet wird Oh

Konfiguration

Konfigurationsdatei

Wenn Sie ihn im Hyperf-Framework verwenden, können Sie nach der Installation der Komponente den folgenden vendor:publishverwenden > Befehl zum Veröffentlichen der Konfigurationsdatei in einem Stück ./config/autoload/dtm.php
composer require dtm/dtm-client

Wenn Sie es in einem Nicht-Hyperf-Framework verwenden, können Sie ./vendor kopieren /dtm/dtm-client/publish/dtm.php Datei in das entsprechende Konfigurationsverzeichnis. <p></p> <pre class="brush:php;toolbar:false">php bin/hyperf.php vendor:publish dtm/dtm-client</pre> <code>vendor:publish 命令一件发布配置文件于 ./config/autoload/dtm.php
use DtmClient\Constants\Protocol;
use DtmClient\Constants\DbType;

return [
    // 客户端与 DTM Server 通讯的协议,支持 Protocol::HTTP 和 Protocol::GRPC 两种
    &#39;protocol&#39; => Protocol::HTTP,
    // DTM Server 的地址
    &#39;server&#39; => &#39;127.0.0.1&#39;,
    // DTM Server 的端口
    &#39;port&#39; => [
        &#39;http&#39; => 36789,
        &#39;grpc&#39; => 36790,
    ],
    // 子事务屏障配置
    &#39;barrier&#39; => [
        // DB 模式下的子事务屏障配置
        &#39;db&#39; => [
            &#39;type&#39; => DbType::MySQL
        ],
        // Redis 模式下的子事务屏障配置
        &#39;redis&#39; => [
            // 子事务屏障记录的超时时间
            &#39;expire_seconds&#39; => 7 * 86400,
        ],
        // 非 Hyperf 框架下应用子事务屏障的类
        &#39;apply&#39; => [],
    ],
    // HTTP 协议下 Guzzle 客户端的通用配置
    &#39;guzzle&#39; => [
        &#39;options&#39; => [],
    ],
];

如果您是在非 Hyperf 框架中使用,可复制 ./vendor/dtm/dtm-client/publish/dtm.php 文件到对应的配置目录中。

<?php
namespace App\Controller;

use DtmClient\TCC;
use DtmClient\TransContext;
use Hyperf\Di\Annotation\Inject;
use Hyperf\HttpServer\Annotation\Controller;
use Hyperf\HttpServer\Annotation\GetMapping;
use Throwable;

#[Controller(prefix: &#39;/tcc&#39;)]
class TccController
{

    protected string $serviceUri = &#39;http://127.0.0.1:9501&#39;;

    #[Inject]
    protected TCC $tcc;

    #[GetMapping(path: &#39;successCase&#39;)]
    public function successCase()
    {
        try {

            $this->tcc->globalTransaction(function (TCC $tcc) {
                // 创建子事务 A 的调用数据
                $tcc->callBranch(
                    // 调用 Try 方法的参数
                    [&#39;amount&#39; => 30],
                    // Try 方法的 URL
                    $this->serviceUri . &#39;/tcc/transA/try&#39;,
                    // Confirm 方法的 URL
                    $this->serviceUri . &#39;/tcc/transA/confirm&#39;,
                    // Cancel 方法的 URL
                    $this->serviceUri . &#39;/tcc/transA/cancel&#39;
                );
                // 创建子事务 B 的调用数据,以此类推
                $tcc->callBranch(
                    [&#39;amount&#39; => 30],
                    $this->serviceUri . &#39;/tcc/transB/try&#39;,
                    $this->serviceUri . &#39;/tcc/transB/confirm&#39;,
                    $this->serviceUri . &#39;/tcc/transB/cancel&#39;
                );
            });
        } catch (Throwable $e) {
            var_dump($e->getMessage(), $e->getTraceAsString());
        }
        // 通过 TransContext::getGid() 获得 全局事务ID 并返回
        return TransContext::getGid();
    }
}

配置中间件

在使用之前,需要配置 DtmClientMiddlewareDtmMiddlewareMiddleware konfigurieren

Vor der Verwendung müssen Sie die Middleware DtmClientMiddlewareDtmMiddleware als globale Middleware des Servers konfigurieren und kann auf verschiedene Frameworks angewendet werden, die dies unterstützen Spezifikation.

Informationen zur Middleware-Konfiguration in Hyperf finden Sie im Kapitel Hyperf-Dokumentation – Middleware.

Verwendung

dtm-client ist sehr einfach zu verwenden. Wir stellen ein Beispielprojekt dtm-php/dtm-sample zur Verfügung, damit Sie es besser verstehen und debuggen können.

Bevor Sie diese Komponente verwenden, wird außerdem dringend empfohlen, die offizielle DTM-Dokumentation zu lesen, um ein detaillierteres Verständnis zu erhalten.

TCC-Modus

Der TCC-Modus ist eine sehr beliebte flexible Transaktionslösung. Das Konzept von TCC besteht aus den Akronymen Try-Confirm-Cancel. Es wurde erstmals 2007 von Pat Helland veröffentlicht. Vorgeschlagen in einem Artikel mit dem Titel „Life über verteilte Transaktionen hinaus: die Meinung eines Abtrünnigen“. 3 Phasen von TCC Stufe bestätigen. Bestätigen führt das Geschäft tatsächlich ohne Geschäftsprüfungen aus und verwendet nur die in der Versuchsphase reservierten Geschäftsressourcen. Abbruchphase: Wenn einer der Versuche aller Zweige fehlschlägt, geht es zur Abbruchphase über. Abbrechen gibt die während der Testphase reservierten Geschäftsressourcen frei. Wenn wir ein Geschäft ähnlich einer Interbank-Überweisung durchführen möchten, befinden sich die Überweisung (TransOut) und die Überweisung (TransIn) in unterschiedlichen Microservices. Das typische Sequenzdiagramm einer erfolgreich abgeschlossenen TCC-Transaktion sieht wie folgt aus:



Codebeispiele

[DTM] Die Betaversion des PHP-Coroutine-Clients v0.1 ist veröffentlicht!Das Folgende zeigt, wie man es im Hyperf-Framework verwendet. Andere Frameworks sind ähnlich beliebt in wichtigen Systemen, erschien erstmals 1987 in der Veröffentlichung SAGAS von Hector Garcaa-Molrna und Kenneth Salem.

Saga ist eine schließlich konsistente Transaktion und eine flexible Transaktion, die auch als Langzeittransaktion bezeichnet wird und aus einer Reihe lokaler Transaktionen besteht. Nachdem jede lokale Transaktion die Datenbank aktualisiert, veröffentlicht sie eine Nachricht oder ein Ereignis, um die Ausführung der nächsten lokalen Transaktion in der globalen Saga-Transaktion auszulösen. Wenn eine lokale Transaktion fehlschlägt, weil einige Geschäftsregeln nicht erfüllt werden können, führt Saga Ausgleichsvorgänge für alle Transaktionen durch, die vor der fehlgeschlagenen Transaktion erfolgreich festgeschrieben wurden. Daher wird es beim Vergleich des Saga-Modus mit dem TCC-Modus oft schwieriger, eine Rollback-Logik zu implementieren, da keine Schritte zur Ressourcenreservierung vorhanden sind.

Saga-Untertransaktionsaufteilung

Zum Beispiel möchten wir ein Geschäft ähnlich einer Interbank-Überweisung durchführen und 30 Yuan von Konto A auf Konto B überweisen. Nach dem Prinzip der Saga-Transaktionen teilen wir das Ganze auf globale Transaktion Für die folgenden Dienste:

TransOut-Dienst, bei dem der Vorgang durchgeführt wird, um 30 Yuan von Konto A abzubuchen

TransOutCompensate-Dienst, Rollback des oben genannten Überweisungsvorgangs, d. h. Konto A wird um 30 Yuan erhöht

Transferservice, hier wird das B-Konto um 30 Yuan erhöht

Übertragungskompensationsdienst (TransInCompensate), der den obigen Transfervorgang rückgängig macht, das heißt, das B-Konto wird um 30 Yuan reduziert

    Die Logik der gesamten Transaktion ist:
  • Überweisung erfolgreich ausführen => Übertragung erfolgreich ausführen => Die globale Transaktion ist abgeschlossen
  • Wenn in der Mitte ein Fehler auftritt, z. B. ein Fehler bei der Übertragung auf Konto B, wird die Kompensationsoperation der ausgeführten Verzweigung aufgerufen :
  • Transfer erfolgreich ausführen => Transfer in konnte nicht ausgeführt werden => Erfolgreich ausgeführter Transfer in Kompensation => Erfolgreich ausgeführter Transfer in Kompensation => Globales Transaktions-Rollback abgeschlossen
  • Das Folgende ist ein typisches Zeitdiagramm einer erfolgreich abgeschlossenen SAGA-Transaktion:

[DTM] Die Betaversion des PHP-Coroutine-Clients v0.1 ist veröffentlicht!

代码示例

以下展示在 Hyperf 框架中的使用方法,其它框架类似

namespace App\Controller;

use DtmClient\Saga;
use DtmClient\TransContext;
use Hyperf\Di\Annotation\Inject;
use Hyperf\HttpServer\Annotation\Controller;
use Hyperf\HttpServer\Annotation\GetMapping;

#[Controller(prefix: &#39;/saga&#39;)]
class SagaController
{

    protected string $serviceUri = &#39;http://127.0.0.1:9501&#39;;

    #[Inject]
    protected Saga $saga;

    #[GetMapping(path: &#39;successCase&#39;)]
    public function successCase(): string
    {
        $payload = [&#39;amount&#39; => 50];
        // 初始化 Saga 事务
        $this->saga->init();
        // 增加转出子事务
        $this->saga->add(
            $this->serviceUri . &#39;/saga/transOut&#39;, 
            $this->serviceUri . &#39;/saga/transOutCompensate&#39;, 
            $payload
        );
        // 增加转入子事务
        $this->saga->add(
            $this->serviceUri . &#39;/saga/transIn&#39;, 
            $this->serviceUri . &#39;/saga/transInCompensate&#39;, 
            $payload
        );
        // 提交 Saga 事务
        $this->saga->submit();
        // 通过 TransContext::getGid() 获得 全局事务ID 并返回
        return TransContext::getGid();
    }
}
Funktionen DTM SEATA Bemerkungen
Unterstützte Sprachen Go, C#, Java, Python, PHP... Java DTM kann sein einfach mit einer Tür verbunden. Neue Sprache Barrieren
Manuelle Verarbeitung DTM löst das Problem von Idempotenz, Aussetzung und Nullkompensation SAGA-Transaktionen Extrem einfach zu bedienen
Zweitens -Phasen-Nachricht
XA-Transaktionen Dubbo und andere Protokolle DTM ist cloudfreundlicher native
DTM veröffentlicht 0 vom 04.06.2021 .1 Version, schnelle Entwicklung

Das obige ist der detaillierte Inhalt von[DTM] Die Betaversion des PHP-Coroutine-Clients v0.1 ist veröffentlicht!. 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