承接 loyaltylu/tcc-transaction 相关项目开发

从需求分析到上线部署,全程专人跟进,保证项目质量与交付效率

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

loyaltylu/tcc-transaction

Composer 安装命令:

composer require loyaltylu/tcc-transaction

包简介

README 文档

README

有兴趣优化和完善的小伙伴欢迎联系我 vx:ai979126035

基于Hyperf的TCC分布式事务

Tcc注意事项:

  • 并发控制
  • 允许空回滚
  • 防悬挂控制
  • 幂等控制
支持 hyperf2.* 版本,感谢 @cexll
目前支持钉钉以及邮件推送事务失败通知,感谢 @lizhanfei

使用方法:

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、将TCC信息保存起来,状态为:待处理
  • 2、预处理阶段(Try),并将处理成功的信息保存起来,以便后续【提交/回滚】使用。
  • 3、根据预处理的结果,决定是提交还是回滚。
  • 4、如果全部处理成功,则修改1中保存起来的数据的状态:处理成功;
  • 5、结束处理,并返回

【异常】流程说明

此异常处理,主要是处理【提交/回滚】时失败,定时查看数据情况。 一旦发现有处理异常的数据,则再一次触发【提交/回滚】流程,如果达到重试上限(默认1次),最后仍处理失败,需要通知相关人员(发送邮件),进行人工干预

注意事项

  • 事务节点信息、事务参数、各个阶段返回值皆保存在redis需要对reids进行持久化设置,避免数据丢失
  • 为防止服务异常使用了消息队列对事务进行回查,如果系统在执行中宕机或其他异常导致服务不可用则消息队列会对异常队列进行补偿,消息队列目前只支持NSQ,也需要进行持久化,避免数据丢失
  • 消息对列采用延时队列,不会立即对事务进行回查,回查时间可以在配置文件中设置,设置回查时间不应小于各个服务的最大响应时间,避免出现异常

TODO:

  • 优化消息队列模块,增加队列选择

项目正在完善中,欢迎大家提出宝贵意见和建议,您的star是我们前进的动力~

loyaltylu/tcc-transaction 适用场景与选型建议

loyaltylu/tcc-transaction 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 162 次下载、GitHub Stars 达 153, 最近一次更新时间为 2020 年 04 月 27 日, 在 PHP 生态内属于活跃度较高的组件。

我们在过去多个企业项目中使用过 loyaltylu/tcc-transaction 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 loyaltylu/tcc-transaction 我们能提供哪些服务?
定制开发 / 二次开发

基于 loyaltylu/tcc-transaction 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 162
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 153
  • 点击次数: 0
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 153
  • Watchers: 4
  • Forks: 16
  • 开发语言: PHP

其他信息

  • 授权协议: Unknown
  • 更新时间: 2020-04-27