文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

PHP协程客户端v0.1 beta版本有哪些新特性

2023-06-29 04:39

关注

这篇文章主要讲解了“PHP协程客户端v0.1 beta版本有哪些新特性”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP协程客户端v0.1 beta版本有哪些新特性”吧!

介绍

dtm/dtm-client 是分布式事务管理器 DTM 的 PHP 客户端,已支持 TCC模式、Saga、二阶段消息模式的分布式事务模式,并分别实现了与 DTM Server 以 HTTP 协议或 gRPC 协议通讯,该客户端可安全运行于 PHP-FPM 和 Swoole 协程环境中,更是对 Hyperf 做了更加易用的功能支持。

关于 DTM

DTM 是一款基于 Go 语言实现的开源分布式事务管理器,提供跨语言,跨存储引擎组合事务的强大功能。DTM 优雅的解决了幂等、空补偿、悬挂等分布式事务难题,也提供了简单易用、高性能、易水平扩展的分布式事务解决方案。

亮点

对比

在非 Java 语言下,暂未看到除 DTM 之外的成熟的分布式事务管理器,因此这里将 DTM 和 Java 中最成熟的开源项目 Seata 做对比:

特性DTMSEATA备注
支持语言Go、C#、Java、Python、PHP…JavaDTM 可轻松接入一门新语言
存储引擎支持数据库、Redis、Mongo等数据库
异常处理子事务屏障自动处理手动处理DTM 解决了幂等、悬挂、空补偿
SAGA事务极简易用复杂状态机
二阶段消息最简消息最终一致性架构
TCC事务
XA事务
AT事务建议使用XAAT 与 XA类似,但有脏回滚
单服务多数据源
通信协议HTTP、gRPCDubbo等协议DTM对云原生更加友好
star数量PHP协程客户端v0.1 beta版本有哪些新特性PHP协程客户端v0.1 beta版本有哪些新特性DTM 从 2021-06-04 发布 0.1版本,发展飞快

从上面对比的特性来看,DTM 在许多方面都具备很大的优势。如果考虑多语言支持、多存储引擎支持,那么 DTM 毫无疑问是您的首选.

安装

通过 Composer 可以非常方便的安装 dtm-client

composer require dtm/dtm-client

配置

配置文件

如果您是在 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 模式

TCC 模式是一种非常流行的柔性事务解决方案,由 Try-Confirm-Cancel 三个单词的首字母缩写分别组成 TCC 的概念,最早是由 Pat Helland 于 2007 年发表的一篇名为《Life beyond Distributed Transactions:an Apostate’s Opinion》的论文中提出。

TCC 的 3 个阶段

Try 阶段:尝试执行,完成所有业务检查(一致性), 预留必须业务资源(准隔离性)
Confirm 阶段:如果所有分支的 Try 都成功了,则走到 Confirm 阶段。Confirm 真正执行业务,不作任何业务检查,只使用 Try 阶段预留的业务资源
Cancel 阶段:如果所有分支的 Try 有一个失败了,则走到 Cancel 阶段。Cancel 释放 Try 阶段预留的业务资源。

如果我们要进行一个类似于银行跨行转账的业务,转出(TransOut)和转入(TransIn)分别在不同的微服务里,一个成功完成的 TCC 事务典型的时序图如下:

PHP协程客户端v0.1 beta版本有哪些新特性

代码示例

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

<?phpnamespace 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) {                // 创建子事务 A 的调用数据                $tcc->callBranch(                    // 调用 Try 方法的参数                    ['amount' => 30],                    // Try 方法的 URL                    $this->serviceUri . '/tcc/transA/try',                    // Confirm 方法的 URL                    $this->serviceUri . '/tcc/transA/confirm',                    // Cancel 方法的 URL                    $this->serviceUri . '/tcc/transA/cancel'                );                // 创建子事务 B 的调用数据,以此类推                $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 模式是分布式事务领域最有名气的解决方案之一,也非常流行于各大系统中,最初出现在 1987 年 由 Hector Garcaa-Molrna & Kenneth Salem 发表的论文 SAGAS 里。

Saga 是一种最终一致性事务,也是一种柔性事务,又被叫做 长时间运行的事务(Long-running-transaction),Saga 是由一系列的本地事务构成。每一个本地事务在更新完数据库之后,会发布一条消息或者一个事件来触发 Saga 全局事务中的下一个本地事务的执行。如果一个本地事务因为某些业务规则无法满足而失败,Saga 会执行在这个失败的事务之前成功提交的所有事务的补偿操作。所以 Saga 模式在对比 TCC 模式时,因缺少了资源预留的步骤,往往在实现回滚逻辑时会变得更麻烦。

Saga 子事务拆分

比如我们要进行一个类似于银行跨行转账的业务,将 A 账户中的 30 元转到 B 账户,根据 Saga 事务的原理,我们将整个全局事务,拆分为以下服务:

整个事务的逻辑是:

执行转出成功 => 执行转入成功 => 全局事务完成

如果在中间发生错误,例如转入 B 账户发生错误,则会调用已执行分支的补偿操作,即:

执行转出成功 => 执行转入失败 => 执行转入补偿成功 => 执行转出补偿成功 => 全局事务回滚完成

下面是一个成功完成的 SAGA 事务典型的时序图:

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: '/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();        // 增加转出子事务        $this->saga->add(            $this->serviceUri . '/saga/transOut',             $this->serviceUri . '/saga/transOutCompensate',             $payload        );        // 增加转入子事务        $this->saga->add(            $this->serviceUri . '/saga/transIn',             $this->serviceUri . '/saga/transInCompensate',             $payload        );        // 提交 Saga 事务        $this->saga->submit();        // 通过 TransContext::getGid() 获得 全局事务ID 并返回        return TransContext::getGid();    }}

感谢各位的阅读,以上就是“PHP协程客户端v0.1 beta版本有哪些新特性”的内容了,经过本文的学习后,相信大家对PHP协程客户端v0.1 beta版本有哪些新特性这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯