PHP协程客户端v0.1 beta版本有哪些新特性
PHP协程客户端v0.1 beta版本有哪些新特性
这篇文章主要讲解了“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 优雅的解决了幂等、空补偿、悬挂等分布式事务难题,也提供了简单易用、高性能、易水平扩展的分布式事务解决方案。
亮点
极易上手
零配置启动服务,提供非常简单的 HTTP 接口,极大降低上手分布式事务的难度
跨语言
可适合多语言栈的公司使用。方便 Go、Python、PHP、NodeJs、Ruby、C# 等各类语言使用。
使用简单
开发者不再担心悬挂、空补偿、幂等各类问题,首创子事务屏障技术代为处理
易部署、易扩展
仅依赖 MySQL/Redis,部署简单,易集群化,易水平扩展
多种分布式事务协议支持
TCC、SAGA、XA、二阶段消息,一站式解决多种分布式事务问题
对比
在非 Java 语言下,暂未看到除 DTM 之外的成熟的分布式事务管理器,因此这里将 DTM 和 Java 中最成熟的开源项目 Seata 做对比:
从上面对比的特性来看,DTM 在许多方面都具备很大的优势。如果考虑多语言支持、多存储引擎支持,那么 DTM 毫无疑问是您的首选.
安装
通过 Composer 可以非常方便的安装 dtm-client
composerrequiredtm/dtm-client
使用时别忘了启动 DTM Server 哦
配置
配置文件
如果您是在 Hyperf 框架中使用,在安装组件后,可通过下面的 vendor:publish
命令一件发布配置文件于 ./config/autoload/dtm.php
phpbin/hyperf.phpvendor:publishdtm/dtm-client
如果您是在非 Hyperf 框架中使用,可复制 ./vendor/dtm/dtm-client/publish/dtm.php
文件到对应的配置目录中。
useDtmClient\Constants\Protocol;useDtmClient\Constants\DbType;return[//客户端与DTMServer通讯的协议,支持Protocol::HTTP和Protocol::GRPC两种'protocol'=>Protocol::HTTP,//DTMServer的地址'server'=>'127.0.0.1',//DTMServer的端口'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 事务典型的时序图如下:
代码示例
以下展示在 Hyperf 框架中的使用方法,其它框架类似
<?phpnamespaceApp\Controller;useDtmClient\TCC;useDtmClient\TransContext;useHyperf\Di\Annotation\Inject;useHyperf\HttpServer\Annotation\Controller;useHyperf\HttpServer\Annotation\GetMapping;useThrowable;#[Controller(prefix:'/tcc')]classTccController{protectedstring$serviceUri='http://127.0.0.1:9501';#[Inject]protectedTCC$tcc;#[GetMapping(path:'successCase')]publicfunctionsuccessCase(){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并返回returnTransContext::getGid();}}
Saga 模式
Saga 模式是分布式事务领域最有名气的解决方案之一,也非常流行于各大系统中,最初出现在 1987 年 由 Hector Garcaa-Molrna & Kenneth Salem 发表的论文 SAGAS 里。
Saga 是一种最终一致性事务,也是一种柔性事务,又被叫做 长时间运行的事务(Long-running-transaction),Saga 是由一系列的本地事务构成。每一个本地事务在更新完数据库之后,会发布一条消息或者一个事件来触发 Saga 全局事务中的下一个本地事务的执行。如果一个本地事务因为某些业务规则无法满足而失败,Saga 会执行在这个失败的事务之前成功提交的所有事务的补偿操作。所以 Saga 模式在对比 TCC 模式时,因缺少了资源预留的步骤,往往在实现回滚逻辑时会变得更麻烦。
Saga 子事务拆分
比如我们要进行一个类似于银行跨行转账的业务,将 A 账户中的 30 元转到 B 账户,根据 Saga 事务的原理,我们将整个全局事务,拆分为以下服务:
转出(TransOut)服务,这里将会进行操作 A 账户扣减 30 元
转出补偿(TransOutCompensate)服务,回滚上面的转出操作,即 A 账户增加 30 元
转入(TransIn)服务,这里将会进行 B 账户增加 30 元
转出补偿(TransInCompensate)服务,回滚上面的转入操作,即 B 账户减少 30 元
整个事务的逻辑是:
执行转出成功 => 执行转入成功 => 全局事务完成
如果在中间发生错误,例如转入 B 账户发生错误,则会调用已执行分支的补偿操作,即:
执行转出成功 => 执行转入失败 => 执行转入补偿成功 => 执行转出补偿成功 => 全局事务回滚完成
下面是一个成功完成的 SAGA 事务典型的时序图:
代码示例
以下展示在 Hyperf 框架中的使用方法,其它框架类似
namespaceApp\Controller;useDtmClient\Saga;useDtmClient\TransContext;useHyperf\Di\Annotation\Inject;useHyperf\HttpServer\Annotation\Controller;useHyperf\HttpServer\Annotation\GetMapping;#[Controller(prefix:'/saga')]classSagaController{protectedstring$serviceUri='http://127.0.0.1:9501';#[Inject]protectedSaga$saga;#[GetMapping(path:'successCase')]publicfunctionsuccessCase():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并返回returnTransContext::getGid();}}
感谢各位的阅读,以上就是“PHP协程客户端v0.1 beta版本有哪些新特性”的内容了,经过本文的学习后,相信大家对PHP协程客户端v0.1 beta版本有哪些新特性这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是恰卡编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!
推荐阅读
-
php字符串增加1如何实现
php字符串增加1如何实现这篇“php字符串增加1如何实现”文章的...
-
php如何判断字符串是否有中文
-
php如何实现字符串去掉头尾
-
php字符串的组成是什么
php字符串的组成是什么这篇文章主要讲解了“php字符串的组成是什...
-
php如何让Swoole/Pool进程池实现Redis持久连接
php如何让Swoole/Pool进程池实现Redis持久连接本篇...
-
php字符串长度不一致如何解决
-
php时区不正确如何解决
-
php+fread()乱码如何解决
php+fread()乱码如何解决本篇内容介绍了“php+frea...
-
php explode报错如何解决
-
linux Centos如何安装PHP7
linuxCentos如何安装PHP7今天小编给大家分享一下li...