目次
Java 以外の言語では、DTM 以外に成熟した分散トランザクション マネージャーはありません。そのため、ここでは DTM と、Java で最も成熟したオープン ソース プロジェクトである Seata の比較を示します。 " >Java 以外の言語では、DTM 以外に成熟した分散トランザクション マネージャーはありません。そのため、ここでは DTM と、Java で最も成熟したオープン ソース プロジェクトである Seata の比較を示します。
ミドルウェアの構成
使用方法" >使用方法
TCC モード" >TCC モード
TCC の 3 つのフェーズ" >TCC の 3 つのフェーズ
コード例" >コード例
Saga パターン
佐賀サブトランザクション分割" >佐賀サブトランザクション分割
代码示例" >代码示例
ホームページ バックエンド開発 PHPチュートリアル 【DTM】PHPコルーチンクライアント v0.1 ベータ版をリリースしました!

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

Feb 15, 2022 pm 03:19 PM

良いニュースです! 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 フェーズ メッセージ、分散トランザクションのさまざまな問題に対するワンストップ ソリューション
##比較 #特長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 モードは、非常に人気のある柔軟なトランザクション ソリューションであり、それぞれ Try-confirm-Cancel の頭字語で構成されています。この概念は Pat Helland によって最初に提案されました。 2007 年に出版された「分散トランザクションを超えた生活: 背教者の意見」というタイトルの論文で述べられています。

試行フェーズ: 実行を試み、すべてのビジネス チェックを完了し (一貫性)、必要なビジネス リソースを確保する (準分離)
確認ステージ: すべてのブランチの 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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Laravelでフラッシュセッションデータを使用します Laravelでフラッシュセッションデータを使用します Mar 12, 2025 pm 05:08 PM

Laravelは、直感的なフラッシュメソッドを使用して、一時的なセッションデータの処理を簡素化します。これは、アプリケーション内に簡単なメッセージ、アラート、または通知を表示するのに最適です。 データは、デフォルトで次の要求のためにのみ持続します。 $リクエスト -

LaravelのバックエンドでReactアプリを構築する:パート2、React LaravelのバックエンドでReactアプリを構築する:パート2、React Mar 04, 2025 am 09:33 AM

これは、LaravelバックエンドとのReactアプリケーションの構築に関するシリーズの2番目と最終部分です。シリーズの最初の部分では、基本的な製品上場アプリケーションのためにLaravelを使用してRESTFUL APIを作成しました。このチュートリアルでは、開発者になります

PHPのカール:REST APIでPHPカール拡張機能を使用する方法 PHPのカール:REST APIでPHPカール拡張機能を使用する方法 Mar 14, 2025 am 11:42 AM

PHPクライアントURL(CURL)拡張機能は、開発者にとって強力なツールであり、リモートサーバーやREST APIとのシームレスな対話を可能にします。尊敬されるマルチプロトコルファイル転送ライブラリであるLibcurlを活用することにより、PHP Curlは効率的なexecuを促進します

Laravelテストでの簡略化されたHTTP応答のモッキング Laravelテストでの簡略化されたHTTP応答のモッキング Mar 12, 2025 pm 05:09 PM

Laravelは簡潔なHTTP応答シミュレーション構文を提供し、HTTP相互作用テストを簡素化します。このアプローチは、テストシミュレーションをより直感的にしながら、コード冗長性を大幅に削減します。 基本的な実装は、さまざまな応答タイプのショートカットを提供します。 Illuminate \ support \ facades \ httpを使用します。 http :: fake([[ 'google.com' => 'hello world'、 'github.com' => ['foo' => 'bar']、 'forge.laravel.com' =>

Codecanyonで12の最高のPHPチャットスクリプト Codecanyonで12の最高のPHPチャットスクリプト Mar 13, 2025 pm 12:08 PM

顧客の最も差し迫った問題にリアルタイムでインスタントソリューションを提供したいですか? ライブチャットを使用すると、顧客とのリアルタイムな会話を行い、すぐに問題を解決できます。それはあなたがあなたのカスタムにより速いサービスを提供することを可能にします

Laravelの通知 Laravelの通知 Mar 04, 2025 am 09:22 AM

この記事では、Laravel Webフレームワークの通知システムを検討します。 Laravelの通知システムを使用すると、さまざまなチャネルでユーザーに通知を送信できます。今日は、通知ovを送信する方法について説明します

PHPにおける後期静的結合の概念を説明します。 PHPにおける後期静的結合の概念を説明します。 Mar 21, 2025 pm 01:33 PM

記事では、PHP 5.3で導入されたPHPの後期静的結合(LSB)について説明し、より柔軟な継承を求める静的メソッドコールのランタイム解像度を可能にします。 LSBの実用的なアプリケーションと潜在的なパフォーマ

PHPロギング:PHPログ分析のベストプラクティス PHPロギング:PHPログ分析のベストプラクティス Mar 10, 2025 pm 02:32 PM

PHPロギングは、Webアプリケーションの監視とデバッグ、および重要なイベント、エラー、ランタイムの動作をキャプチャするために不可欠です。システムのパフォーマンスに関する貴重な洞察を提供し、問題の特定に役立ち、より速いトラブルシューティングをサポートします

See all articles