Rumah  >  Artikel  >  pembangunan bahagian belakang  >  [DTM] Versi beta klien coroutine PHP v0.1 dikeluarkan!

[DTM] Versi beta klien coroutine PHP v0.1 dikeluarkan!

藏色散人
藏色散人ke hadapan
2022-02-15 15:19:484404semak imbas

Berita baik Pengurus Transaksi Teragih DTM Pelanggan coroutine PHP v0.1 versi beta dikeluarkan! ! !
→ github.com/dtm-php/dtm-client

Pengenalan

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]

Mengenai DTM

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.

Sorotan

  • Mudah untuk dimulakan
    • Mulakan perkhidmatan dengan konfigurasi sifar, sediakan antara muka HTTP yang sangat mudah, mengurangkan keperluan untuk bermula dengan transaksi yang diedarkan Kesukaran
  • rentas bahasa
    • boleh sesuai untuk syarikat yang mempunyai susunan berbilang bahasa. Mudah untuk menggunakan Go, Python, PHP, NodeJs, Ruby, C# dan bahasa lain.
  • Mudah digunakan
    • Pembangun tidak perlu lagi bimbang tentang pelbagai isu seperti penggantungan, pampasan batal, eksponen, dsb., teknologi halangan sub-transaksi pertama yang mengendalikan mereka bagi pihak anda
  • Mudah digunakan dan dikembangkan
    • Hanya bergantung pada MySQL/Redis, mudah digunakan, mudah dikelompokkan dan mudah dikembangkan secara mendatar
  • Pelbagai protokol transaksi teragih Menyokong
    • TCC, SAGA, XA, mesej dua fasa, penyelesaian sehenti kepada pelbagai masalah transaksi yang diedarkan

Perbandingan

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数量 github stars github stars 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.

Pemasangan

Amat mudah untuk memasang dtm-client melalui Komposer

composer require dtm/dtm-client
  • Jangan lupa untuk memulakan Pelayan DTM apabila menggunakannya

Konfigurasi

Fail Konfigurasi

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

Konfigurasikan middleware

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

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

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.

Tiga fasa TCC

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 :

[DTM] Versi beta klien coroutine PHP v0.1 dikeluarkan!

Contoh kod

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: &#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();
    }
}

Corak Saga

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.

Pecahan sub-urus niaga Saga

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:

  • Perkhidmatan TransOut, di mana operasi akan dilakukan untuk memotong 30 yuan daripada akaun A
  • Perkhidmatan Pampasan Keluar (TransOutCompensate), gulung semula operasi pindahan keluar di atas, iaitu, akaun A meningkat sebanyak 30 yuan
  • dan dipindahkan ke perkhidmatan (TransIn) Di sini, akaun B meningkat sebanyak 30 yuan Pemindahan
  • Keluar daripada perkhidmatan pampasan (TransInCompensate) dan gulung semula operasi pemindahan di atas, iaitu, akaun B dikurangkan sebanyak 30 yuan

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 :

[DTM] Versi beta klien coroutine PHP v0.1 dikeluarkan!

代码示例

以下展示在 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();
    }
}

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!

Kenyataan:
Artikel ini dikembalikan pada:learnku.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam