Table of Contents
##Comparison" >##Comparison
Configuring middleware
Usage" >Usage
TCC mode" >TCC mode
Three phases of TCC" >Three phases of TCC
Code example" >Code example
Saga Pattern
Saga sub-transaction split" >Saga sub-transaction split
代码示例" >代码示例
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!

Feb 15, 2022 pm 03:19 PM

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
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 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.

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!

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.

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!

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

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Roblox: Bubble Gum Simulator Infinity - How To Get And Use Royal Keys
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
Nordhold: Fusion System, Explained
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Hot Topics

Java Tutorial
1664
14
PHP Tutorial
1269
29
C# Tutorial
1249
24
PHP and Python: Comparing Two Popular Programming Languages PHP and Python: Comparing Two Popular Programming Languages Apr 14, 2025 am 12:13 AM

PHP and Python each have their own advantages, and choose according to project requirements. 1.PHP is suitable for web development, especially for rapid development and maintenance of websites. 2. Python is suitable for data science, machine learning and artificial intelligence, with concise syntax and suitable for beginners.

Explain secure password hashing in PHP (e.g., password_hash, password_verify). Why not use MD5 or SHA1? Explain secure password hashing in PHP (e.g., password_hash, password_verify). Why not use MD5 or SHA1? Apr 17, 2025 am 12:06 AM

In PHP, password_hash and password_verify functions should be used to implement secure password hashing, and MD5 or SHA1 should not be used. 1) password_hash generates a hash containing salt values ​​to enhance security. 2) Password_verify verify password and ensure security by comparing hash values. 3) MD5 and SHA1 are vulnerable and lack salt values, and are not suitable for modern password security.

PHP in Action: Real-World Examples and Applications PHP in Action: Real-World Examples and Applications Apr 14, 2025 am 12:19 AM

PHP is widely used in e-commerce, content management systems and API development. 1) E-commerce: used for shopping cart function and payment processing. 2) Content management system: used for dynamic content generation and user management. 3) API development: used for RESTful API development and API security. Through performance optimization and best practices, the efficiency and maintainability of PHP applications are improved.

PHP: A Key Language for Web Development PHP: A Key Language for Web Development Apr 13, 2025 am 12:08 AM

PHP is a scripting language widely used on the server side, especially suitable for web development. 1.PHP can embed HTML, process HTTP requests and responses, and supports a variety of databases. 2.PHP is used to generate dynamic web content, process form data, access databases, etc., with strong community support and open source resources. 3. PHP is an interpreted language, and the execution process includes lexical analysis, grammatical analysis, compilation and execution. 4.PHP can be combined with MySQL for advanced applications such as user registration systems. 5. When debugging PHP, you can use functions such as error_reporting() and var_dump(). 6. Optimize PHP code to use caching mechanisms, optimize database queries and use built-in functions. 7

The Enduring Relevance of PHP: Is It Still Alive? The Enduring Relevance of PHP: Is It Still Alive? Apr 14, 2025 am 12:12 AM

PHP is still dynamic and still occupies an important position in the field of modern programming. 1) PHP's simplicity and powerful community support make it widely used in web development; 2) Its flexibility and stability make it outstanding in handling web forms, database operations and file processing; 3) PHP is constantly evolving and optimizing, suitable for beginners and experienced developers.

How does PHP type hinting work, including scalar types, return types, union types, and nullable types? How does PHP type hinting work, including scalar types, return types, union types, and nullable types? Apr 17, 2025 am 12:25 AM

PHP type prompts to improve code quality and readability. 1) Scalar type tips: Since PHP7.0, basic data types are allowed to be specified in function parameters, such as int, float, etc. 2) Return type prompt: Ensure the consistency of the function return value type. 3) Union type prompt: Since PHP8.0, multiple types are allowed to be specified in function parameters or return values. 4) Nullable type prompt: Allows to include null values ​​and handle functions that may return null values.

PHP vs. Python: Understanding the Differences PHP vs. Python: Understanding the Differences Apr 11, 2025 am 12:15 AM

PHP and Python each have their own advantages, and the choice should be based on project requirements. 1.PHP is suitable for web development, with simple syntax and high execution efficiency. 2. Python is suitable for data science and machine learning, with concise syntax and rich libraries.

PHP and Python: Code Examples and Comparison PHP and Python: Code Examples and Comparison Apr 15, 2025 am 12:07 AM

PHP and Python have their own advantages and disadvantages, and the choice depends on project needs and personal preferences. 1.PHP is suitable for rapid development and maintenance of large-scale web applications. 2. Python dominates the field of data science and machine learning.

See all articles