PHP協(xié)程客戶端v0.1beta版本有哪些新特性

這篇文章主要講解了“PHP協(xié)程客戶端v0.1 beta版本有哪些新特性”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“PHP協(xié)程客戶端v0.1 beta版本有哪些新特性”吧!

創(chuàng)新互聯(lián)的團隊成員不追求數(shù)量、追求質(zhì)量。我們經(jīng)驗豐富并且專業(yè),我們之間合作時就好像一個人,協(xié)同一致毫無保留。創(chuàng)新互聯(lián)珍視想法,同時也看重過程轉(zhuǎn)化帶來的沖擊力和影響力,在我們眼中,任何細節(jié)都不容小覷。一直致力于為企業(yè)提供從國際域名空間、網(wǎng)站策劃、網(wǎng)站設計、購物商城網(wǎng)站建設、網(wǎng)站推廣、網(wǎng)站優(yōu)化到為企業(yè)提供個性化軟件開發(fā)等基于互聯(lián)網(wǎng)的全面整合營銷服務。

介紹

dtm/dtm-client 是分布式事務管理器 DTM 的 PHP 客戶端,已支持 TCC模式、Saga、二階段消息模式的分布式事務模式,并分別實現(xiàn)了與 DTM Server 以 HTTP 協(xié)議或 gRPC 協(xié)議通訊,該客戶端可安全運行于 PHP-FPM 和 Swoole 協(xié)程環(huán)境中,更是對 Hyperf 做了更加易用的功能支持。

關于 DTM

DTM 是一款基于 Go 語言實現(xiàn)的開源分布式事務管理器,提供跨語言,跨存儲引擎組合事務的強大功能。DTM 優(yōu)雅的解決了冪等、空補償、懸掛等分布式事務難題,也提供了簡單易用、高性能、易水平擴展的分布式事務解決方案。

亮點

  • 極易上手

    • 零配置啟動服務,提供非常簡單的 HTTP 接口,極大降低上手分布式事務的難度

  • 跨語言

    • 可適合多語言棧的公司使用。方便 Go、Python、PHP、NodeJs、Ruby、C# 等各類語言使用。

  • 使用簡單

    • 開發(fā)者不再擔心懸掛、空補償、冪等各類問題,首創(chuàng)子事務屏障技術代為處理

  • 易部署、易擴展

    • 僅依賴 MySQL/redis,部署簡單,易集群化,易水平擴展

  • 多種分布式事務協(xié)議支持

    • TCC、SAGA、XA、二階段消息,一站式解決多種分布式事務問題

對比

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

特性DTMSEATA備注
支持語言Go、C#、Java、Python、PHP…JavaDTM 可輕松接入一門新語言
存儲引擎支持數(shù)據(jù)庫、Redis、Mongo等數(shù)據(jù)庫
異常處理子事務屏障自動處理手動處理DTM 解決了冪等、懸掛、空補償
SAGA事務極簡易用復雜狀態(tài)機
二階段消息??最簡消息最終一致性架構(gòu)
TCC事務??
XA事務??
AT事務建議使用XA?AT 與 XA類似,但有臟回滾
單服務多數(shù)據(jù)源??
通信協(xié)議HTTP、gRPCDubbo等協(xié)議DTM對云原生更加友好
star數(shù)量PHP協(xié)程客戶端v0.1 beta版本有哪些新特性PHP協(xié)程客戶端v0.1 beta版本有哪些新特性DTM 從 2021-06-04 發(fā)布 0.1版本,發(fā)展飛快

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

安裝

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

composer require dtm/dtm-client
  • 使用時別忘了啟動 DTM Server 哦

配置

配置文件

如果您是在 Hyperf 框架中使用,在安裝組件后,可通過下面的 vendor:publish 命令一件發(fā)布配置文件于 ./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 通訊的協(xié)議,支持 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 協(xié)議下 Guzzle 客戶端的通用配置
    'guzzle' => [
        'options' => [],
    ],
];

配置中間件

在使用之前,需要配置 DtmClient\Middleware\DtmMiddleware 中間件作為 Server 的全局中間件,該中間件支持 PSR-15 規(guī)范,可適用于各個支持該規(guī)范的的框架。
在 Hyperf 中的中間件配置可參考 Hyperf文檔 - 中間件 一章。

使用

dtm-client 的使用非常簡單,我們提供了一個示例項目 dtm-php/dtm-sample 來幫助大家更好的理解和調(diào)試。
在使用該組件之前,也強烈建議您先閱讀 DTM 官方文檔,以做更詳細的了解。

TCC 模式

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

TCC 的 3 個階段

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

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

PHP協(xié)程客戶端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: '/tcc')]
class TccController
{

    protected string $serviceUri = 'http://127.0.0.1:9501';

    #[Inject]
    protected TCC $tcc;

    #[GetMapping(path: 'successCase')]
    public function successCase()
    {
        try {

            $this->tcc->globalTransaction(function (TCC $tcc) {
                // 創(chuàng)建子事務 A 的調(diào)用數(shù)據(jù)
                $tcc->callBranch(
                    // 調(diào)用 Try 方法的參數(shù)
                    ['amount' => 30],
                    // Try 方法的 URL
                    $this->serviceUri . '/tcc/transA/try',
                    // Confirm 方法的 URL
                    $this->serviceUri . '/tcc/transA/confirm',
                    // Cancel 方法的 URL
                    $this->serviceUri . '/tcc/transA/cancel'
                );
                // 創(chuàng)建子事務 B 的調(diào)用數(shù)據(jù),以此類推
                $tcc->callBranch(
                    ['amount' => 30],
                    $this->serviceUri . '/tcc/transB/try',
                    $this->serviceUri . '/tcc/transB/confirm',
                    $this->serviceUri . '/tcc/transB/cancel'
                );
            });
        } catch (Throwable $e) {
            var_dump($e->getMessage(), $e->getTraceAsString());
        }
        // 通過 TransContext::getGid() 獲得 全局事務ID 并返回
        return TransContext::getGid();
    }
}

Saga 模式

Saga 模式是分布式事務領域最有名氣的解決方案之一,也非常流行于各大系統(tǒng)中,最初出現(xiàn)在 1987 年 由 Hector Garcaa-Molrna & Kenneth Salem 發(fā)表的論文 SAGAS 里。

Saga 是一種最終一致性事務,也是一種柔性事務,又被叫做 長時間運行的事務(Long-running-transaction),Saga 是由一系列的本地事務構(gòu)成。每一個本地事務在更新完數(shù)據(jù)庫之后,會發(fā)布一條消息或者一個事件來觸發(fā) Saga 全局事務中的下一個本地事務的執(zhí)行。如果一個本地事務因為某些業(yè)務規(guī)則無法滿足而失敗,Saga 會執(zhí)行在這個失敗的事務之前成功提交的所有事務的補償操作。所以 Saga 模式在對比 TCC 模式時,因缺少了資源預留的步驟,往往在實現(xiàn)回滾邏輯時會變得更麻煩。

Saga 子事務拆分

比如我們要進行一個類似于銀行跨行轉(zhuǎn)賬的業(yè)務,將 A 賬戶中的 30 元轉(zhuǎn)到 B 賬戶,根據(jù) Saga 事務的原理,我們將整個全局事務,拆分為以下服務:

  • 轉(zhuǎn)出(TransOut)服務,這里將會進行操作 A 賬戶扣減 30 元

  • 轉(zhuǎn)出補償(TransOutCompensate)服務,回滾上面的轉(zhuǎn)出操作,即 A 賬戶增加 30 元

  • 轉(zhuǎn)入(TransIn)服務,這里將會進行 B  賬戶增加 30 元

  • 轉(zhuǎn)出補償(TransInCompensate)服務,回滾上面的轉(zhuǎn)入操作,即 B 賬戶減少 30 元

整個事務的邏輯是:

執(zhí)行轉(zhuǎn)出成功 => 執(zhí)行轉(zhuǎn)入成功 => 全局事務完成

如果在中間發(fā)生錯誤,例如轉(zhuǎn)入 B 賬戶發(fā)生錯誤,則會調(diào)用已執(zhí)行分支的補償操作,即:

執(zhí)行轉(zhuǎn)出成功 => 執(zhí)行轉(zhuǎn)入失敗 => 執(zhí)行轉(zhuǎn)入補償成功 => 執(zhí)行轉(zhuǎn)出補償成功 => 全局事務回滾完成

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

PHP協(xié)程客戶端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: '/saga')]
class SagaController
{

    protected string $serviceUri = 'http://127.0.0.1:9501';

    #[Inject]
    protected Saga $saga;

    #[GetMapping(path: 'successCase')]
    public function successCase(): string
    {
        $payload = ['amount' => 50];
        // 初始化 Saga 事務
        $this->saga->init();
        // 增加轉(zhuǎn)出子事務
        $this->saga->add(
            $this->serviceUri . '/saga/transOut', 
            $this->serviceUri . '/saga/transOutCompensate', 
            $payload
        );
        // 增加轉(zhuǎn)入子事務
        $this->saga->add(
            $this->serviceUri . '/saga/transIn', 
            $this->serviceUri . '/saga/transInCompensate', 
            $payload
        );
        // 提交 Saga 事務
        $this->saga->submit();
        // 通過 TransContext::getGid() 獲得 全局事務ID 并返回
        return TransContext::getGid();
    }
}

感謝各位的閱讀,以上就是“PHP協(xié)程客戶端v0.1 beta版本有哪些新特性”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對PHP協(xié)程客戶端v0.1 beta版本有哪些新特性這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關知識點的文章,歡迎關注!

分享題目:PHP協(xié)程客戶端v0.1beta版本有哪些新特性
文章分享:http://bm7419.com/article18/pcicgp.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、建站公司、小程序開發(fā)Google、電子商務、ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

手機網(wǎng)站建設