Hyperf方案 分布式事务(Saga 模式)
最佳选择是 dtm-php/dtm-client — DTM 官方 PHP 协程客户端原生支持 Hyperf支持 Saga、TCC、XA 等模式。 --- 安装composerrequire dtm-php/dtm-client DTM ServerGo 服务需单独部署dockerrun-p36789:36789-p36790:36790 yedf/dtm:latest --- Hyperf 配置 config/autoload/dtm.php?phpreturn[serverenv(DTM_SERVER,http://127.0.0.1:36789),gid_prefixenv(APP_NAME,app),barrier[db[driverenv(DB_DRIVER,mysql),],],];--- Saga 示例转账场景?php namespace App\Service;use DtmClient\Saga;use DtmClient\TransContext;use Hyperf\Di\Annotation\Inject;class TransferService{#[Inject]protected Saga$saga;publicfunctiontransfer(int$fromId, int$toId, float$amount): string{$baseUrlhttp://order-service/api;$gid$this-saga-init();$this-saga -add(action:{$baseUrl}/deduct, compensate:{$baseUrl}/deduct-compensate, postData:[user_id$fromId,amount$amount])-add(action:{$baseUrl}/deposit, compensate:{$baseUrl}/deposit-compensate, postData:[user_id$toId,amount$amount])-submit();return$gid;}}--- 子事务接口含幂等屏障?php namespace App\Controller;use DtmClient\Barrier;use Hyperf\HttpServer\Annotation\Controller;use Hyperf\HttpServer\Annotation\PostMapping;#[Controller(prefix: /api)]class AccountController{#[Inject]protected Barrier$barrier;// 正向操作#[PostMapping(path: deduct)]publicfunctiondeduct(): array{$userId$this-request-input(user_id);$amount$this-request-input(amount);$this-barrier-call(function()use($userId,$amount){// DB 操作barrier 自动保证幂等 Account::where(id,$userId)-decrement(balance,$amount);});return[resultSUCCESS];}// 补偿操作#[PostMapping(path: deduct-compensate)]publicfunctiondeductCompensate(): array{$userId$this-request-input(user_id);$amount$this-request-input(amount);$this-barrier-call(function()use($userId,$amount){Account::where(id,$userId)-increment(balance,$amount);});return[resultSUCCESS];}}--- 关键点 ┌─────────────────┬─────────────────────────────────────────┐ │ 特性 │ 说明 │ ├─────────────────┼─────────────────────────────────────────┤ │ Barrier::call()│ 自动处理幂等、悬挂、空补偿问题 │ ├─────────────────┼─────────────────────────────────────────┤ │ 补偿接口 │ 必须是正向操作的逆操作且幂等 │ ├─────────────────┼─────────────────────────────────────────┤ │ 返回值 │ 成功返回 SUCCESS失败返回 HTTP 4xx/5xx │ ├─────────────────┼─────────────────────────────────────────┤ │ DTM Server │ 负责协调重试和补偿调度 │ └─────────────────┴─────────────────────────────────────────┘ Barrier 是核心它通过在 DB 插入屏障记录来解决分布式事务的三大难题幂等/悬挂/空补偿不需要自己写这些逻辑。