目錄
設定中間件
使用" >使用
TCC 模式" >TCC 模式
TCC 的3 個階段" >TCC 的3 個階段
程式碼範例" >程式碼範例
Saga模式
Saga 子事務分割" >Saga 子事務分割
代码示例" >代码示例
首頁 後端開發 php教程 【DTM】PHP協程客戶端v0.1 beta版本發布囉!

【DTM】PHP協程客戶端v0.1 beta版本發布囉!

Feb 15, 2022 pm 03:19 PM

好消息! DTM 分散式事務管理器 PHP 協程客戶端 v0.1 beta 版本發布! ! !
→ github.com/dtm-php/dtm-client

#介紹

dtm/dtm-client 是分散式事務管理器DTM 的PHP 用戶端,已支援TCC模式、Saga、二階段訊息模式的分散式事務模式,並分別實現了與DTM Server 以HTTP 協定或gRPC 協定通訊,該用戶端可安全運行於PHP-FPM 和Swoole 協程在環境中,更是對Hyperf 做了更易用的功能支援。 【推薦:PHP影片教學

關於DTM

DTM 是一款基於Go 語言實作的開源分散式交易管理器,提供跨語言,跨儲存引擎組合事務的強大功能。 DTM 優雅的解決了冪等、空補償、懸掛等分散式事務難題,也提供了簡單易用、高效能、易水平擴展的分散式事務解決方案。

亮點

  • 極易上手
    • 零配置啟動服務,提供非常簡單的HTTP 接口,大幅降低上手分散式事務的難度
  • 跨語言
    • 可適合多語言堆疊的公司使用。方便 Go、Python、PHP、NodeJs、Ruby、C# 等各類語言使用。
  • 使用簡單
    • 開發者不再擔心懸掛、空補償、冪等各類問題,首創子事務屏障技術代為處理
  • 易部署、易擴展
    • 僅依賴MySQL/Redis,部署簡單,易叢集化,易水平擴展
  • 多種分散式事務協議支援
    • TCC、SAGA、XA、二階段訊息,一站式解決多種分散式交易問題

對比

在非Java 語言下,暫未看到除DTM 之外的成熟的分散式事務管理器,因此這裡將DTM 和Java 中最成熟的開源專案Seata 做對比:

##支援語言DTM 可輕鬆接入一門新語言。儲存引擎異常處理## 手動處理#SAGA交易#二階段訊息##✓ ✓✓ 建議使用XA✓HTTP、gRPCDTM 從2021-06-04 發佈0.1版本,發展快速##

從上面對比的特性來看,DTM 在許多方面都具備很大的優勢。如果考慮多語言支援、多儲存引擎支持,那麼DTM 毫無疑問是您的首選.

#安裝

#透過Composer 可以非常方便的安裝dtm-client

composer require dtm/dtm-client
登入後複製
  • 使用時別忘了啟動DTM Server 哦

#設定

設定檔

如果您是在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 中介軟體作為Server 的全域中間件,該中間件支援PSR-15 規範,可適用於各個支持該規範的框架。
在 Hyperf 中的中間件配置可參考 Hyperf文檔 - 中間件 一章。

使用

dtm-client 的使用非常簡單,我們提供了一個範例專案 dtm-php/dtm-sample 來幫助大家更好的理解和除錯。
在使用該元件之前,也強烈建議您先閱讀 DTM 官方文檔,以做更詳細的了解。

TCC 模式是一種非常流行的柔性事務解決方案,由Try-Confirm-Cancel 三個單字的首字母縮寫分別組成TCC 的概念,最早是由Pat Helland 於2007 年發表的一篇名為《Life beyond Distributed Transactions:an Apostate's Opinion》的論文中提出。

Try 階段:嘗試執行,完成所有業務檢查(一致性), 預留必須業務資源(準隔離性)
Confirm 階段:如果所有分支的Try 都成功了,則走到Confirm 階段。 Confirm 真正執行業務,不作任何業務檢查,只使用 Try 階段預留的業務資源
Cancel 階段:如果所有分支的 Try 有一個失敗了,則走到 Cancel 階段。 Cancel 釋放 Try 階段預留的業務資源。

如果我們要進行一個類似銀行跨行轉帳的業務,轉出(TransOut)和轉入(TransIn)分別在不同的微服務裡,一個成功完成的TCC 事務典型的時序圖如下:

【DTM】PHP協程客戶端v0.1 beta版本發布囉!

以下展示在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 模式是分散式事務領域最有名氣的解決方案之一,也非常流行於各大系統中,最初出現在1987 年由Hector Garcaa-Molrna & Kenneth Salem 發表的論文SAGAS 裡。

Saga 是一種最終一致性事務,也是一種柔性事務,又被稱為 長時間運行的事務(Long-running-transaction),Saga 是由一系列的本地事務構成。每一個本地事務在更新完資料庫之後,會發布一則訊息或一個事件來觸發 Saga 全域事務中的下一個本地事務的執行。如果一個本地事務因為某些業務規則無法滿足而失敗,Saga 會執行在這個失敗的事務之前成功提交的所有事務的補償操作。所以 Saga 模式在比較 TCC 模式時,因缺少了資源預留的步驟,往往在實作回滾邏輯時會變得更麻煩。

#例如我們要進行一個類似銀行跨行轉帳的業務,將A 帳戶中的30 元轉到B 帳戶,根據Saga事務的原理,我們將整個全域事務,拆分為以下服務:

  • 轉出(TransOut)服務,這裡將會進行操作A 帳戶扣減30 元
  • 轉出補償(TransOutCompensate)服務,回滾上面的轉出操作,即A 帳戶增加30 元
  • 轉入(TransIn)服務,這裡將會進行B  帳戶增加30 元
  • 轉出補償(TransInCompensate)服務,回滾上面的轉入操作,即B 帳戶減少30 元

整個事務的邏輯是:

執行轉出成功=> 執行轉入成功=> 全域事務完成

如果在中間發生錯誤,例如轉入B 帳戶發生錯誤,則會呼叫已執行分支的補償操作,即:

執行轉出成功=> 執行轉入失敗=> 執行轉入補償成功=> 執行轉出補償成功=> 全域事務回滾完成

下面是一個成功完成的SAGA 事務典型的時序圖:

【DTM】PHP協程客戶端v0.1 beta版本發布囉!

以下展示在 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();
    }
}
登入後複製
特性 DTM SEATA #備註
Go、C#、Java、Python、PHP… Java
支援資料庫、Redis、Mongo等 資料庫
# 子交易屏障會自動處理 DTM 解決了冪等、懸掛、空補償
##極簡易用 複雜狀態機
最簡訊息最終一致性架構 TCC交易

XA交易

#AT交易
AT 與XA類似,但有髒回滾 單一服務多資料來源

#通訊協定
Dubbo等協定 DTM對雲端原生更友善 star數量
github starsgithub stars

以上是【DTM】PHP協程客戶端v0.1 beta版本發布囉!的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1677
14
CakePHP 教程
1431
52
Laravel 教程
1334
25
PHP教程
1280
29
C# 教程
1257
24
說明PHP中的安全密碼散列(例如,password_hash,password_verify)。為什麼不使用MD5或SHA1? 說明PHP中的安全密碼散列(例如,password_hash,password_verify)。為什麼不使用MD5或SHA1? Apr 17, 2025 am 12:06 AM

在PHP中,應使用password_hash和password_verify函數實現安全的密碼哈希處理,不應使用MD5或SHA1。1)password_hash生成包含鹽值的哈希,增強安全性。 2)password_verify驗證密碼,通過比較哈希值確保安全。 3)MD5和SHA1易受攻擊且缺乏鹽值,不適合現代密碼安全。

PHP類型提示如何起作用,包括標量類型,返回類型,聯合類型和無效類型? PHP類型提示如何起作用,包括標量類型,返回類型,聯合類型和無效類型? Apr 17, 2025 am 12:25 AM

PHP類型提示提升代碼質量和可讀性。 1)標量類型提示:自PHP7.0起,允許在函數參數中指定基本數據類型,如int、float等。 2)返回類型提示:確保函數返回值類型的一致性。 3)聯合類型提示:自PHP8.0起,允許在函數參數或返回值中指定多個類型。 4)可空類型提示:允許包含null值,處理可能返回空值的函數。

PHP和Python:解釋了不同的範例 PHP和Python:解釋了不同的範例 Apr 18, 2025 am 12:26 AM

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

在PHP和Python之間進行選擇:指南 在PHP和Python之間進行選擇:指南 Apr 18, 2025 am 12:24 AM

PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。

PHP和Python:深入了解他們的歷史 PHP和Python:深入了解他們的歷史 Apr 18, 2025 am 12:25 AM

PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。

PHP和框架:現代化語言 PHP和框架:現代化語言 Apr 18, 2025 am 12:14 AM

PHP在現代化進程中仍然重要,因為它支持大量網站和應用,並通過框架適應開發需求。 1.PHP7提升了性能並引入了新功能。 2.現代框架如Laravel、Symfony和CodeIgniter簡化開發,提高代碼質量。 3.性能優化和最佳實踐進一步提升應用效率。

為什麼要使用PHP?解釋的優點和好處 為什麼要使用PHP?解釋的優點和好處 Apr 16, 2025 am 12:16 AM

PHP的核心優勢包括易於學習、強大的web開發支持、豐富的庫和框架、高性能和可擴展性、跨平台兼容性以及成本效益高。 1)易於學習和使用,適合初學者;2)與web服務器集成好,支持多種數據庫;3)擁有如Laravel等強大框架;4)通過優化可實現高性能;5)支持多種操作系統;6)開源,降低開發成本。

PHP的影響:網絡開發及以後 PHP的影響:網絡開發及以後 Apr 18, 2025 am 12:10 AM

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

See all articles