ホームページ >バックエンド開発 >PHPチュートリアル >【DTM】PHPコルーチンクライアント v0.1 ベータ版をリリースしました!

【DTM】PHPコルーチンクライアント v0.1 ベータ版をリリースしました!

藏色散人
藏色散人転載
2022-02-15 15:19:484449ブラウズ

良いニュースです! DTM 分散トランザクション マネージャー PHP コルーチン クライアント v0.1 ベータ版がリリースされました。 ! !
→ github.com/dtm-php/dtm-client

はじめに

dtm/dtm-client は分散トランザクション マネージャー DTM PHP です。クライアントは、TCC モード、Saga、2 フェーズ メッセージ モードの分散トランザクション モードをサポートし、それぞれ HTTP プロトコルまたは gRPC プロトコルを使用して DTM サーバーとの通信を実装しており、PHP-FPM および Swoole コルーチンで安全に実行できます。環境に合わせて、Hyperf の使いやすい機能サポートも提供します。 [推奨: PHP ビデオ チュートリアル ]

DTM について

DTM は、Go 言語に基づいたオープンソースの分散トランザクション マネージャーであり、強力な機能を提供します。言語やストレージ エンジンを超えてトランザクションを結合します。 DTM は、冪等性、ヌル補償、一時停止などの分散トランザクションの問題をエレガントに解決し、使いやすく、パフォーマンスが高く、水平方向に拡張しやすい分散トランザクション ソリューションも提供します。

ハイライト

  • 開始が簡単
    • ゼロ構成でサービスを開始し、非常にシンプルな HTTP インターフェイスを提供するため、分散トランザクションを開始するコスト
  • クロスランゲージ
    • という難しさは、複数言語スタックを持つ企業に適している可能性があります。 Go、Python、PHP、NodeJs、Ruby、C#、その他の言語を使用すると便利です。
  • 使いやすさ
    • 開発者は、ハング、ヌル補正、累乗などの問題を心配する必要がなく、最初のサブトランザクション バリア テクノロジがこれらの問題を処理します
  • #デプロイが簡単、拡張が簡単
    • MySQL/Redis のみに依存、デプロイが簡単、クラスタリングが簡単、水平方向の拡張が簡単
    #複数の分散トランザクション プロトコルをサポート
  • TCC、SAGA、XA、2 フェーズ メッセージ、分散トランザクションのさまざまな問題に対するワンストップ ソリューション
##比較

Java 以外の言語では、DTM 以外に成熟した分散トランザクション マネージャーはありません。そのため、ここでは DTM と、Java で最も成熟したオープン ソース プロジェクトである Seata の比較を示します。

#特長DTMSEATA備考サポートされる言語DTM は可能簡単にアクセスできる新しい言語ストレージ エンジン例外処理DTM は冪等性、一時停止、ヌル補償を解決しますSAGA トランザクション#2 フェーズ メッセージ✓✗##TCC トランザクション✓ は推奨 XAAT XA に似ていますが、ダーティ ロールバックが必要です単一サービスの複数のデータ ソース#✓HTTP、gRPCDTM はクラウド ネイティブに適しています

上記で比較した特徴から判断すると、DTM には多くの点で大きな利点があります。複数言語のサポートと複数のストレージ エンジンのサポートを考慮する場合、DTM が最初の選択肢となることは間違いありません。

インストール

dtm-client をインストールすると非常に便利です。 Composer 経由

composer require dtm/dtm-client
  • DTM サーバーを使用するときは忘れずに起動してください

Configuration

##構成ファイル

Hyperf フレームワークを使用している場合は、コンポーネントをインストールした後、次の vendor:publish コマンドを使用して、./config に構成ファイルを公開できます。 /autoload/dtm.php

php bin/hyperf.php vendor:publish dtm/dtm-client

Hyperf 以外のフレームワークで使用している場合は、./vendor/dtm/dtm-client/publish/dtm.php をコピーできます。 ファイルを対応する構成ディレクトリの中央にコピーします。

use DtmClient\Constants\Protocol;
use DtmClient\Constants\DbType;

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

ミドルウェアの構成

使用前に、DtmClient\Middleware\DtmMiddleware を構成する必要があります。このミドルウェアはサーバーのグローバル ミドルウェアとして使用され、ミドルウェアはサーバーのグローバル ミドルウェアとして使用されます。 PSR-15 仕様。この仕様をサポートするすべてのフレームワークに適用されます。
Hyperf でのミドルウェア構成については、「Hyperf ドキュメント - ミドルウェア」の章を参照してください。

使用方法

dtm-client の使用は非常に簡単で、誰もがよりよく理解してデバッグできるように、サンプル プロジェクト dtm-php/dtm-sample が提供されています。
このコンポーネントを使用する前に、より詳細な理解のために公式 DTM ドキュメントを読むことも強くお勧めします。

TCC モード

TCC モードは、非常に人気のある柔軟なトランザクション ソリューションであり、それぞれ Try-confirm-Cancel の頭字語で構成されています。この概念は Pat Helland によって最初に提案されました。 2007 年に出版された「分散トランザクションを超えた生活: 背教者の意見」というタイトルの論文で述べられています。

TCC の 3 つのフェーズ

試行フェーズ: 実行を試み、すべてのビジネス チェックを完了し (一貫性)、必要なビジネス リソースを確保する (準分離)
確認ステージ: すべてのブランチの Try が成功した場合は、確認ステージに進みます。確認は、業務チェックを行わずに実際に業務を実行し、Try フェーズで予約されたビジネス リソースのみを使用します。
Cancel フェーズ: すべてのブランチの Try の 1 つが失敗した場合、Cancel フェーズに移行します。キャンセルすると、試行フェーズ中に予約されたビジネス リソースが解放されます。

銀行間送金と同様のビジネスを実行したい場合、送金 (TransOut) と送金 (TransIn) は別のマイクロサービスにあります。正常に完了した TCC トランザクションの一般的なシーケンス図は次のとおりです。 :

【DTM】PHPコルーチンクライアント v0.1 ベータ版をリリースしました!

コード例

以下は、Hyperf フレームワークでの使用方法を示しています。他のフレームワークも同様です。

<?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();
    }
}

Saga パターン

Saga パターンは、分散トランザクションの分野で最も有名なソリューションの 1 つであり、主要なシステムでも非常に人気があります。Hector Garcaa-Molrna によって出版された論文 SAGAS に初めて登場しました。ケネス・セイラム、1987年。

Saga は、結果的に整合性のあるトランザクションであり、長時間実行トランザクション (Long-running-transaction) とも呼ばれる柔軟なトランザクションであり、一連のローカル トランザクションで構成されます。各ローカル トランザクションがデータベースを更新した後、メッセージまたはイベントを発行して、Saga グローバル トランザクション内の次のローカル トランザクションの実行をトリガーします。一部のビジネス ルールを満たすことができないためにローカル トランザクションが失敗した場合、Saga は、失敗したトランザクションの前に正常にコミットされたすべてのトランザクションに対して補償操作を実行します。したがって、Saga モードと TCC モードを比較すると、リソース予約手順が不足しているため、ロールバック ロジックの実装がより困難になることがよくあります。

佐賀サブトランザクション分割

たとえば、銀行間送金と同様の業務を実行したい、口座 A から口座 B に 30 元を送金したい、Saga によると、トランザクションの原則では、グローバルトランザクション全体を次のサービスに分割します:

    #転送サービス。アカウント A
  • ## から 30 元を差し引く操作が実行されます。 #送金補償 (TransOutCompensate) サービス、上記の送金操作をロールバックします。つまり、A のアカウントは 30 元増加します
  • 送金 (TransIn) サービス、ここでは B のアカウントは 30 元増加します
  • 送金 補償 (TransInCompensate) サービスを実行し、上記の送金操作をロールバックします。つまり、B アカウントが 30 元減額されます。
  • トランザクション全体のロジックは次のとおりです。

送金実行成功 => 送金実行成功 => グローバルトランザクション完了

アカウント B への送金時にエラーが発生した場合など、途中でエラーが発生した場合、実行されたアカウントの補填操作が実行されます。

転送アウトの実行成功 => 転送インの実行に失敗しました=> 転送イン補償の実行に成功しました=> 転送アウト補償の実行に成功しました=> グローバル トランザクションロールバックが完了しました

次は、正常に完了した SAGA トランザクションの一般的なタイミング図です。

【DTM】PHPコルーチンクライアント v0.1 ベータ版をリリースしました!

代码示例

以下展示在 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();
    }
}
Go、C#、Java、Python、PHP... Java
データベース、Redis、Mongo などをサポート データベース
サブトランザクションバリア自動処理 手動処理
非常に使いやすい 複雑なステート マシン
最も単純なメッセージ結果整合性アーキテクチャ
##✓ #XA トランザクション
#AT トランザクション
##✗ #通信プロトコル
Dubbo およびその他のプロトコル
星の数
DTM は 2021 年 6 月 4 日からバージョン 0.1 をリリースし、急速に発展しています github stars

以上が【DTM】PHPコルーチンクライアント v0.1 ベータ版をリリースしました!の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はlearnku.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。