基于Hyperf的TCC分布式事务
有兴趣优化和完善的小伙伴欢迎联系我 vx:ai979126035
基于Hyperf的TCC分布式事务
composer require loyaltylu/tcc-transaction
php bin/hyperf.php vendor:publish loyaltylu/tcc-transaction
use LoyaltyLu\TccTransaction\Annotation\Compensable;
/**
* @Inject
* @var CalculatorServiceInterface
*/
private $service;
/**
* @Compensable(
* master={"services": CalculatorServiceInterface::class, "tryMethod": "creditOrderTcc", "confirmMethod": "confirmCreditOrderTcc", "cancelMethod": "cancelCreditOrderTcc"},
* slave={
* {"services": PayServiceInterface::class, "tryMethod": "creditAccountTcc", "confirmMethod": "confirmCreditAccountTcc", "cancelMethod": "cancelCreditAccountTcc"},
* }
* )
* @return array
*/
public function index(){
$input = $this->request->input('id');
return $this->service->creditOrderTcc($input);
}
注解说明:
master:主业务服务(事务发起方)
slave:从业务服务(事务参与方)(多个)
services:服务接口
tryMethod:try阶段方法
confirmMethod: confirm阶段方法
cancelMethod: cancel阶段方法
事务调用
只需要调用主业务服务try阶段方法,事务管理器会根据各个服务返回决定执行confirm阶段还是cancel阶段
$input = $this->request->input('id');
return $this->service->creditOrderTcc($input);
事务传参
事务各个阶段如果需要传参只需要对主业务服务try阶段方法传入参数,事务管理器会将try阶段参数代入各个阶段方法,同时也会将try阶段返回值一并代入下个阶段
事务参与者应响应失败需要使用throw
抛出
目前不支持自定义失败异常,后期会考虑
/**
* Class CalculatorService.
* @RpcService(name="PayService", protocol="jsonrpc-http", server="jsonrpc-http", publishTo="consul")
*/
class PayService implements PayServiceInterface
{
public function creditAccountTcc($input)
{
throw new \Exception('msg');
}
}
此异常处理,主要是处理【提交/回滚】时失败,定时查看数据情况。 一旦发现有处理异常的数据,则再一次触发【提交/回滚】流程,如果达到重试上限(默认1次),最后仍处理失败,需要通知相关人员(发送邮件),进行人工干预
项目正在完善中,欢迎大家提出宝贵意见和建议,您的star是我们前进的动力~