Home > Backend Development > PHP Tutorial > [DTM] PHP coroutine client v0.1 beta version is released!

[DTM] PHP coroutine client v0.1 beta version is released!

藏色散人
Release: 2023-04-10 21:54:01
forward
4415 people have browsed it

good news! DTM Distributed Transaction Manager PHP coroutine client v0.1 beta version released! ! !
→ github.com/dtm-php/dtm-client

Introduction

dtm/dtm-client is the distributed transaction manager DTM The PHP client has supported the distributed transaction mode of TCC mode, Saga, and two-phase message mode, and has implemented communication with the DTM Server using the HTTP protocol or gRPC protocol respectively. The client can run safely in PHP-FPM and Swoole coroutines. environment, it also provides easier-to-use functional support for Hyperf. [Recommended: PHP Video Tutorial]

About DTM

DTM is an open source distributed transaction manager based on Go language, providing The powerful ability to combine transactions across languages ​​and storage engines. DTM elegantly solves distributed transaction problems such as idempotence, null compensation, and suspension, and also provides a distributed transaction solution that is simple to use, high-performance, and easy to expand horizontally.

Highlights

  • Easy to get started
    • Start the service with zero configuration and provide a very simple HTTP interface, which greatly reduces the cost of getting started with distributed transactions The difficulty
  • Cross-language
    • can be suitable for companies with multi-language stacks. Convenient to use Go, Python, PHP, NodeJs, Ruby, C# and other languages.
  • Easy to use
    • Developers no longer have to worry about hanging, null compensation, exponentiation and other issues, the first sub-transaction barrier technology handles them for you
  • Easy to deploy, easy to expand
    • Only relies on MySQL/Redis, simple deployment, easy to cluster, easy to expand horizontally
  • Multiple distributed transaction protocols Support
    • TCC, SAGA, XA, two-phase messages, one-stop solution to various distributed transaction problems

##Comparison

In non-Java languages, there is no mature distributed transaction manager other than DTM, so here is a comparison between DTM and Seata, the most mature open source project in Java:

##XA Transaction✓ ✓##AT transactionSingle service multiple data sources HTTP, gRPCDubbo and other protocolsDTM is more friendly to cloud nativenumber of stars

Judging from the characteristics compared above, DTM has great advantages in many aspects. If you consider multi-language support and multi-storage engine support, then DTM is undoubtedly your first choice.

Installation

It is very convenient to install dtm-client through Composer

composer require dtm/dtm-client
Copy after login
  • Don’t forget to start the DTM Server when using it

Configuration

Configuration file

If you are using the Hyperf framework, after installing the component, you can use the following vendor:publish command to publish the configuration file in ./config/autoload/dtm. php

php bin/hyperf.php vendor:publish dtm/dtm-client
Copy after login

If you are using it in a non-Hyperf framework, you can copy the ./vendor/dtm/dtm-client/publish/dtm.php file to the corresponding configuration directory middle.

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' => [],
    ],
];
Copy after login

Configuring middleware

Before use, you need to configure DtmClient\Middleware\DtmMiddleware The middleware is used as the global middleware of the Server, and the middleware supports the PSR-15 specification. , applicable to every framework that supports this specification.
For middleware configuration in Hyperf, please refer to the Hyperf Documentation - Middleware chapter.

Usage

The use of dtm-client is very simple. We provide a sample project dtm-php/dtm-sample to help everyone better understand and debug.
Before using this component, it is also strongly recommended that you read the official DTM documentation for a more detailed understanding.

TCC mode

TCC mode is a very popular flexible transaction solution, consisting of the acronyms of Try-Confirm-Cancel respectively. The concept was first proposed by Pat Helland in a paper titled "Life beyond Distributed Transactions: an Apostate's Opinion" published in 2007.

Three phases of TCC

Try phase: try to execute, complete all business checks (consistency), reserve necessary business resources (quasi-isolation)
Confirm stage: If the Try of all branches is successful, go to the Confirm stage. Confirm actually executes the business without any business checks, and only uses the business resources reserved in the Try phase.
Cancel phase: If one of the Trys of all branches fails, it goes to the Cancel phase. Cancel releases the business resources reserved during the Try phase.

If we want to conduct a business similar to an inter-bank transfer, the transfer (TransOut) and the transfer (TransIn) are in different microservices. The typical sequence diagram of a successfully completed TCC transaction is as follows:

[DTM] PHP coroutine client v0.1 beta version is released!

Code example

The following shows how to use it in the Hyperf framework, other frameworks are similar

<?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();
    }
}
Copy after login

Saga Pattern

The Saga pattern is one of the most famous solutions in the field of distributed transactions and is also very popular in major systems. It first appeared in the paper SAGAS published by Hector Garcaa-Molrna & Kenneth Salem in 1987. .

Saga is an eventually consistent transaction and a flexible transaction, also called a long-running transaction (Long-running-transaction). Saga is composed of a series of local transactions. After each local transaction updates the database, it will publish a message or an event to trigger the execution of the next local transaction in the Saga global transaction. If a local transaction fails because some business rules cannot be satisfied, Saga will perform compensating operations for all transactions that were successfully committed before the failed transaction. Therefore, when comparing Saga mode to TCC mode, it often becomes more troublesome to implement rollback logic due to the lack of resource reservation steps.

Saga sub-transaction split

For example, we want to perform a business similar to a bank inter-bank transfer, transfer 30 yuan from account A to account B, according to Saga The principle of the transaction, we split the entire global transaction into the following services:

  • Transfer service, where the operation will be performed to deduct 30 yuan from account A
  • Transfer Out Compensate (TransOutCompensate) service, roll back the above transfer out operation, that is, A's account will increase by 30 yuan
  • Transfer in (TransIn) service, here B's account will increase by 30 yuan
  • transfer Execute the compensation (TransInCompensate) service and roll back the above transfer operation, that is, the B account is reduced by 30 yuan

The logic of the entire transaction is:

Execute transfer successfully => Execute Transfer successful => Global transaction completed

If an error occurs in the middle, for example, an error occurs when transferring to account B, the compensation operation of the executed branch will be called, that is:

Execute transfer out Success => Failed to execute transfer-in=> Successfully executed transfer-in compensation=> Successfully executed transfer-out compensation=> Global transaction rollback completed

The following is a typical timing diagram of a successfully completed SAGA transaction :

[DTM] PHP coroutine client v0.1 beta version is released!

代码示例

以下展示在 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();
    }
}
Copy after login
Features DTM SEATA Remarks
Supported languages Go, C#, Java, Python, PHP... Java DTM can be easily accessed A new language
Storage engine Support database, Redis, Mongo, etc. Database
Exception handling Sub-transaction barrier automatic processing Manual Processing DTM solves idempotence, suspension, and null compensation
SAGA transactions Extremely easy to use Complex state machine
Two-phase message The simplest message eventual consistency architecture
TCC transaction ##✓

is recommended XA AT Similar to XA, but with dirty rollback
##✗ ##Communication Protocol
github starsDTM released version 0.1 from 2021-06-04, developing rapidly github stars

The above is the detailed content of [DTM] PHP coroutine client v0.1 beta version is released!. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:learnku.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template