Home>Article>Backend Development> [DTM] PHP coroutine client v0.1 beta version is released!
good news! DTM Distributed Transaction Manager PHP coroutine client v0.1 beta version released! ! !
→ github.com/dtm-php/dtm-client
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]
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.
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.
It is very convenient to install dtm-client through Composer
composer require dtm/dtm-client
If you are using the Hyperf framework, after installing the component, you can use the followingvendor:publish
command to publish the configuration file in./config/autoload/dtm. php
php bin/hyperf.php vendor:publish dtm/dtm-client
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' => [], ], ];
Before use, you need to configureDtmClient\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.
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:
The following shows how to use it in the Hyperf framework, other frameworks are similar
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(); } }
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:
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 :
以下展示在 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(); } }
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 | Single service multiple data sources |
✓ | ##✗ | ##Communication Protocol | HTTP, gRPC
|
DTM is more friendly to cloud native | number of stars | ||
DTM released version 0.1 from 2021-06-04, developing rapidly |
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!