Rumah >pembangunan bahagian belakang >tutorial php >[DTM] Versi beta klien coroutine PHP v0.1 dikeluarkan!
Berita baik Pengurus Transaksi Teragih DTM Pelanggan coroutine PHP v0.1 versi beta dikeluarkan! ! !
→ github.com/dtm-php/dtm-client
dtm/dtm-client ialah pengurus transaksi teragih DTM The PHP pelanggan telah menyokong mod transaksi teragih mod TCC, Saga, dan mod mesej dua fasa, dan telah melaksanakan komunikasi dengan Pelayan DTM masing-masing menggunakan protokol HTTP atau protokol gRPC Pelanggan boleh berjalan dengan selamat dalam coroutine PHP-FPM dan Swoole. persekitaran, ia juga menyediakan sokongan fungsi yang lebih mudah digunakan untuk Hyperf. [Disyorkan: Tutorial video PHP]
DTM ialah pengurus transaksi teragih sumber terbuka berdasarkan bahasa Go, menyediakan Keupayaan berkuasa untuk menggabungkan urus niaga merentas bahasa dan enjin storan. DTM secara elegan menyelesaikan masalah transaksi teragih seperti mati pucuk, pampasan batal dan penggantungan, dan juga menyediakan penyelesaian transaksi teragih yang mudah digunakan, berprestasi tinggi dan mudah dikembangkan secara mendatar.
Dalam bahasa bukan Jawa, tiada pengurus transaksi teragih matang selain DTM, jadi berikut adalah perbandingan antara DTM dan Seata, sumber terbuka yang paling matang projek dalam Java:
特性 | DTM | SEATA | 备注 |
---|---|---|---|
支持语言 | Go、C#、Java、Python、PHP… | Java | DTM 可轻松接入一门新语言 |
存储引擎 | 支持数据库、Redis、Mongo等 | 数据库 | |
异常处理 | 子事务屏障自动处理 | 手动处理 | DTM 解决了幂等、悬挂、空补偿 |
SAGA事务 | 极简易用 | 复杂状态机 | |
二阶段消息 | ✓ | ✗ | 最简消息最终一致性架构 |
TCC事务 | ✓ | ✓ | |
XA事务 | ✓ | ✓ | |
AT事务 | 建议使用XA | ✓ | AT 与 XA类似,但有脏回滚 |
单服务多数据源 | ✓ | ✗ | |
通信协议 | HTTP、gRPC | Dubbo等协议 | DTM对云原生更加友好 |
star数量 | DTM 从 2021-06-04 发布 0.1版本,发展飞快 |
Jika dilihat dari ciri-ciri yang dibandingkan di atas, DTM mempunyai kelebihan yang besar dalam banyak aspek. Jika anda menganggap sokongan berbilang bahasa dan sokongan enjin berbilang storan, maka DTM sudah pasti pilihan pertama anda.
Amat mudah untuk memasang dtm-client melalui Komposer
composer require dtm/dtm-client
Jika anda menggunakannya dalam rangka kerja Hyperf, selepas memasang komponen, anda boleh menggunakan perintah vendor:publish
berikut untuk menerbitkan fail konfigurasi dalam satu bahagian ./config/autoload/dtm.php
php bin/hyperf.php vendor:publish dtm/dtm-client
Jika anda Apabila digunakan dalam rangka kerja bukan Hyperf, salin fail ./vendor/dtm/dtm-client/publish/dtm.php
ke direktori konfigurasi yang sepadan.
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' => [], ], ];
Sebelum menggunakannya, anda perlu mengkonfigurasi DtmClientMiddlewareDtmMiddleware
middleware sebagai middleware global pelayan ini menyokong spesifikasi PSR-15 dan boleh digunakan kepada setiap sokongan Rangka kerja normatif.
Untuk konfigurasi middleware dalam Hyperf, sila rujuk kepada Hyperf Documentation - Middleware bab.
Menggunakan dtm-client adalah sangat mudah Kami menyediakan contoh projek dtm-php/dtm-sample untuk membantu anda memahami dan menyahpepijat dengan lebih baik.
Sebelum menggunakan komponen ini, anda juga amat disyorkan untuk membaca dokumentasi rasmi DTM untuk pemahaman yang lebih terperinci.
Mod TCC ialah penyelesaian transaksi fleksibel yang sangat popular, masing-masing terdiri daripada akronim Try-Confirm-Cancel Konsep ini pertama kali dicadangkan oleh Pat Helland dalam kertas kerja bertajuk "Life beyond Distributed Transactions: an Apostate's Opinion" yang diterbitkan pada 2007.
Fasa percubaan: cuba laksanakan, lengkapkan semua semakan perniagaan (konsistensi), simpan sumber perniagaan yang diperlukan (kuasi-pengasingan)
Sahkan peringkat: Jika Cuba semua cawangan berjaya, pergi ke peringkat Sahkan. Sahkan sebenarnya melaksanakan perniagaan tanpa sebarang semakan perniagaan dan hanya menggunakan sumber perniagaan yang dikhaskan dalam fasa Cuba
Fasa Batal: Jika salah satu daripada Percubaan semua cawangan gagal, ia pergi ke fasa Batal. Batal mengeluarkan sumber perniagaan yang dikhaskan semasa fasa Cuba.
Jika kami ingin menjalankan perniagaan yang serupa dengan pindahan antara bank, pindahan (TransOut) dan pindahan (TransIn) adalah dalam perkhidmatan mikro yang berbeza Rajah jujukan biasa bagi transaksi TCC yang berjaya adalah seperti berikut :
Berikut menunjukkan cara menggunakannya dalam rangka kerja Hyperf adalah serupa
<?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: '/tcc')] class TccController { protected string $serviceUri = 'http://127.0.0.1:9501'; #[Inject] protected TCC $tcc; #[GetMapping(path: 'successCase')] public function successCase() { 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 并返回 return TransContext::getGid(); } }
Corak Saga adalah salah satu penyelesaian yang paling terkenal dalam bidang urus niaga yang diedarkan dan ia juga sangat popular dalam sistem utama & Kenneth Salem pada tahun 1987. Dalam SAGAS.
Saga ialah urus niaga yang akhirnya konsisten dan urus niaga yang fleksibel Ia juga dipanggil transaksi jangka panjang yang terdiri daripada satu siri urus niaga tempatan. Selepas setiap transaksi tempatan mengemas kini pangkalan data, ia akan menerbitkan mesej atau peristiwa untuk mencetuskan pelaksanaan transaksi tempatan seterusnya dalam transaksi global Saga. Jika transaksi tempatan gagal kerana beberapa peraturan perniagaan tidak dapat dipenuhi, Saga akan melaksanakan operasi pampasan untuk semua transaksi yang berjaya dilakukan sebelum transaksi yang gagal. Oleh itu, apabila membandingkan mod Saga dengan mod TCC, selalunya menjadi lebih menyusahkan untuk melaksanakan logik rollback kerana kekurangan langkah tempahan sumber.
Sebagai contoh, kami ingin menjalankan perniagaan yang serupa dengan pindahan antara bank, memindahkan 30 yuan dalam akaun A ke akaun B, menurut Saga Prinsip transaksi, kami membahagikan keseluruhan transaksi global kepada perkhidmatan berikut:
Logik keseluruhan transaksi ialah :
Melaksanakan pemindahan berjaya => Melaksanakan Pemindahan berjaya => Urus niaga global selesai
Jika ralat berlaku di tengah, seperti ralat dalam memindahkan ke akaun B, operasi pampasan yang dilaksanakan cawangan akan dipanggil, iaitu:
Melaksanakan pindahan keluar Berjaya=> Berjaya melaksanakan pemindahan masuk=> pemulangan selesai
Berikut ialah gambarajah pemasaan biasa bagi transaksi SAGA yang berjaya diselesaikan :
以下展示在 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(); } }
Atas ialah kandungan terperinci [DTM] Versi beta klien coroutine PHP v0.1 dikeluarkan!. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!