PHP学习_手把手教你用PHP完成一个分布式事务TCC

2021-09-23 0 816 百度已收录

甚么是TCC,TCC是Try、Confirm、Cancel三个词语的缩写,最先是由 Pat Helland 于 2007 年宣布的一篇名为《Life beyond Distributed Transactions:an Apostate’s Opinion》的论文提出。

TCC构成

TCC分为3个阶段

  • Try 阶段:测验考试履行,实现一切营业反省(分歧性), 预留必需营业资本(准断绝性)
  • Confirm 阶段:假如一切分支的Try都成功了,则走到Confirm阶段。Confirm真正履行营业,没有作任何营业反省,只运用 Try 阶段预留的营业资本
  • Cancel 阶段:假如一切分支的Try有一个失败了,则走到Cancel阶段。Cancel开释 Try 阶段预留的营业资本。

TCC散布式事件里,有3个脚色,与典范的XA散布式事件同样:

  • AP/使用顺序,倡议全局事件,界说全局事件包括哪些事件分支
  • RM/资本办理器,担任分支事件各项资本的办理
  • TM/事件办理器,担任和谐全局事件的精确履行,包含Confirm,Cancel的履行,并处置收集非常

假如咱们要停止一个相似于银行跨行转账的营业,转出(TransOut)以及转入(TransIn)辨别正在差别的微效劳里,一个成功实现的TCC事件典范的时序图以下:

PHP学习_手把手教你用PHP完成一个分布式事务TCC

TCC理论

上面咱们停止一个TCC事件的详细开辟

今朝可用于TCC的开源框架,次要为Java言语,此中以seata为代表。咱们的例子采纳nodejs,运用的散布式事件框架为dtm,它对于散布式事件的撑持十分文雅。上面来具体解说TCC的构成

上面咱们来编写详细的Try/Confirm/Cancel的处置函数

$vega->handleFunc('/api/TransOutTry', function (Mix\\Vega\\Context $ctx) {
    var_dump('TransOutTry', $ctx->request->getQueryParams(), $ctx->request->getParsedBody());
    $ctx->JSON(200, ['result' => 'SUCCESS']);})->methods('POST');$vega->handleFunc('/api/TransOutConfirm', function (Mix\\Vega\\Context $ctx) {
    var_dump('TransOutConfirm', $ctx->request->getQueryParams(), $ctx->request->getParsedBody());
    $ctx->JSON(200, ['result' => 'SUCCESS']);})->methods('POST');$vega->handleFunc('/api/TransOutCancel', function (Mix\\Vega\\Context $ctx) {
    var_dump('TransOutCancel', $ctx->request->getQueryParams(), $ctx->request->getParsedBody());
    $ctx->JSON(200, ['result' => 'SUCCESS']);})->methods('POST');$vega->handleFunc('/api/TransInTry', function (Mix\\Vega\\Context $ctx) {
    var_dump('TransInTry', $ctx->request->getQueryParams(), $ctx->request->getParsedBody());
    $ctx->JSON(200, ['result' => 'SUCCESS']);})->methods('POST');$vega->handleFunc('/api/TransInConfirm', function (Mix\\Vega\\Context $ctx) {
    var_dump('TransInConfirm', $ctx->request->getQueryParams(), $ctx->request->getParsedBody());
    $ctx->JSON(200, ['result' => 'SUCCESS']);})->methods('POST');$vega->handleFunc('/api/TransInCancel', function (Mix\\Vega\\Context $ctx) {
    var_dump('TransInCancel', $ctx->request->getQueryParams(), $ctx->request->getParsedBody());
    $ctx->JSON(200, ['result' => 'SUCCESS']);})->methods('POST');

到此各个子事件的处置函数曾经OK了,而后是开启TCC事件,停止分支挪用

    Dtmcli\\tccGlobalTransaction($dtm, function ($tcc) use ($svc) {
        /** @var Dtmcli\\Tcc $tcc */
        $req = ['amount' => 30];
        $tcc->callBranch($req, $svc . '/TransOutTry', $svc . '/TransOutConfirm', $svc . '/TransOutCancel');
        $tcc->callBranch($req, $svc . '/TransInTry', $svc . '/TransInConfirm', $svc . '/TransInCancel');
    });

至此,一个完好的TCC散布式事件编写实现。

假如您想要完好运转一个成功的示例,那末参考这个例子yedf/dtmcli-php-sample,将它运转起来十分复杂

# 安排启动dtm# 需求docker版本18以上git clone https://github.com/yedf/dtmcd dtm
docker-compose up# 另起一个饬令行https://github.com/yedf/dtmcli-php-sample.gitcd dtmcli-php-sample
composer installphp demo.php start

TCC的回滚

假设银即将金额预备转入用户2时,发明用户2的账户非常,前往失败,会怎样样?咱们可让TransIn前往失败来模仿这类状况

$vega->handleFunc('/api/TransInTry', function (Mix\\Vega\\Context $ctx) {
    var_dump('TransInTry', $ctx->request->getQueryParams(), $ctx->request->getParsedBody());
    $ctx->JSON(200, ['result' => 'FAILURE']);})->methods('POST');

咱们给失事务失败交互的时序图

PHP学习_手把手教你用PHP完成一个分布式事务TCC

这个跟成功的TCC差异就正在于,当某个子事件前往失败后,后续就回滚全局事件,挪用各个子事件的Cancel操纵,包管全局事件局部回滚。

正在TCC事件形式上,有很多的读者会问,假如Confirm/Cancel失败会怎样样?这是一个好成绩,代表您在深化考虑TCC事件形式。第一种状况是暂时失败,比方收集毛病、使用或者数据库宕机,这种过错停止重试,最初会前往成功;另外一种状况为营业失败,依照TCC的和谈,第一阶段锁定资本,包管充足的资本可以让Confirm/Cancel履行,也便是说,顺序逻辑上,Confirm/Cancel是没有答应前往营业失败的,假如呈现营业失败,那末是bug,需求开辟职员手动修复bug。

小结

正在这篇文章里,咱们介绍了TCC的实际常识,也经过一个例子,完好给出了编写一个TCC事件的进程,涵盖了一般成功实现,和成功回滚的状况。置信读者经过这边文章,对于TCC曾经有了深化的了解。

对于散布式事件更多更片面的常识,请参考《散布式事件最典范的七种处理计划》

文中运用的例子节选自yedf/dtm(https://github.com/yedf/dtm),它撑持多种事件形式:TCC、SAGA、XA、事件音讯 跨言语撑持,已经撑持 golang、python、Java、PHP、nodejs等言语的客户端,参考各言语SDK(https://dtm.pub/su妹妹ary/code.html#go)。供给子事件樊篱功用,文雅处理幂等、吊挂、空抵偿等成绩。

浏览完此篇干货,欢送大师拜访github.com/yedf/dtm名目,给颗星星撑持!

以上便是手把手教你用PHP实现一个散布式事件TCC的具体内容,更多请存眷酷吧易资源网别的相关文章!

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

酷吧易资源网 PHP教程 PHP学习_手把手教你用PHP完成一个分布式事务TCC https://www.kubayi.com/7698.html

常见问题

相关文章

评论
暂无评论