colornet/htcc 问题修复 & 功能扩展

解决BUG、新增功能、兼容多环境部署,快速响应你的开发需求

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

colornet/htcc

Composer 安装命令:

composer require colornet/htcc

包简介

A tcc-transaction component for hyperf.

关键字:

README 文档

README

composer require ericjank/htcc

php bin/hyperf.php vendor:publish ericjank/htcc

注册异常处理器

config/autoload/exceptions.php

在rpc接口服务配置下新增 Ericjank\Htcc\Exception\Handler\TransactionException::class

例如:

return [
    'handler' => [
        'http' => [
            App\Exception\Handler\AppClientExceptionHandler::class,
            App\Exception\Handler\AppValidationExceptionHandler::class,
            App\Exception\Handler\AppTokenValidExceptionHandler::class,
            App\Exception\Handler\UnauthorizedExceptionHandler::class,
            App\Exception\Handler\AppExceptionHandler::class,
        ],
        'jsonrpc' => [
            Ericjank\Htcc\Exception\Handler\TransactionException::class
        ]
    ],
];

在需要进行事务处理的第一个方法体添加注解

use Ericjank\Htcc\Annotation\Compensable;

/**
 * @Compensable(
 *     onConfirm="sendSmsConfirm",
 *     onCancel="sendSmsCancel",
 *     clients={
 *         {
 *             "service": App\JsonRpc\Communal\SmsInterface::class,
 *             "try": "send",
 *             "onConfirm": "sendConfirm",
 *             "onCancel": "sendCancel",
 *         }
 *     }
 * )
 */
public function sendSms($message, $user_id) 
{

    ...
}

public function sendSmsConfirm($message, $user_id)
{
    ...
}

public function sendSmsCancel($message, $user_id)
{
    ...
}
  • try try阶段执行的方法名, 如不指定try则该接口全部方法在本次事务中如有调用都进行事务处理
  • onConfirm confirm阶段执行的方法名
  • onCancel cancel阶段执行的方法名
  • clients 当前事务需要监控的接口, 不是过程中所有的接口都需要事务处理, 方法中使用的不需要事务处理的接口不必配置到监控列表里
  • service 接口消费者类

如未设置confirm和cancel方法 则默认以调用方法开头以Confirm或Cancel作为方法后缀自动调用

实现try, confirm,cancel方法

被调用端接口需实现try, confirm,cancel方法, 方法内如发生错误需要抛出 Ericjank\Htcc\Exception\RpcTransactionException 异常
, 才能被上层接口捕获并进行相应的处理 为了不影响接口自身在非事务情况下的使用(或者说兼容事务与非事务两种情况),可以使用 inRpcTrans() 方法判断当前是否在rpc事务中,仅在事务中抛出 RpcTransactionException 异常,其他情况则按照原有流程正常执行即可;

也可以用函数 rpcTransCallback 进行简化处理

rpcTransCallback(function() {
    // 非事务状态下执行的代码
}, '事务状态下的异常消息', '事务状态下的异常CODE')

使用 Ericjank\Htcc\Catcher 处理分布式事务防悬挂、空回滚等问题

try 阶段

通过注入 Ericjank\Htcc\Catcher 获取对象 $this->catcher

// 分布式事务安全验证开始
$tried = $this->catcher->try();

if ( ! $tried)
{
    $code = $this->catcher->getCode();
    switch ($code) {
        case CatcherCode::HTCC_CATCHER_IDEMPOTENT:
            return ['code' => 200];

        case CatcherCode::HTCC_CATCHER_ERR:
            throw new RpcTransactionException($code, $this->catcher->getMessage());
        
        default:
            throw new RpcTransactionException($code, '未知错误');
    }
}
// 分布式事务安全验证结束

// ... 业务代码

// 使用 setParams 方法可以在各个try、confirm、cancel方法之间传递数据
$this->catcher->setParams([
    'u' => 1
]);

// 使用 getParam 方法获取 setParams 设置的数据
$this->catcher->getParam('u');


$this->catcher->lock($value); // 可以记录资源变动数值, 可选, 通常变动的值会通过参数传递到confirm、cancel阶段所以一般无需记录

// 处理成功时设置try阶段完成
$this->catcher->pass();

confirm 阶段

// 分布式事务安全验证开始
$confirm = $this->catcher->confirm(function() {
    // 未发现空回滚、防悬挂等问题后执行的回调函数
    // 回调结束后会自动释放锁
    // 如果不设置这个回调, 则在返回成功信息前需要手动释放锁 $this->catcher->release()
    
    // ... 业务代码
});

if ( ! $confirm)
{
    $code = $this->catcher->getCode();
    switch ($code) {
        case CatcherCode::HTCC_CATCHER_IDEMPOTENT:
            return true;

        case CatcherCode::HTCC_CATCHER_ERR:
        case CatcherCode::HTCC_CATCHER_CALLBACK_ERR:
            throw new RpcTransactionException($code, $this->catcher->getMessage());
        
        default:
            throw new RpcTransactionException($code, '未知错误');
    }
}
// 分布式事务安全验证结束

$value = $this->catcher->getLock(); // 获取由lock记录的资源变动数值

cancel 阶段

// 分布式事务安全验证开始
$cancel = $this->catcher->cancel(function() {
    // 未发现空回滚、防悬挂等问题后执行的回调函数
    // 回调结束后会自动释放锁
    // 如果不设置这个回调, 则在返回成功信息前需要手动释放锁 $this->catcher->release()

    // ... 业务代码
});

if ( ! $cancel)
{
    $code = $this->catcher->getCode();
    switch ($code) {
        case CatcherCode::HTCC_CATCHER_IDEMPOTENT:
            return true;

        case CatcherCode::HTCC_CATCHER_ERR:
        case CatcherCode::HTCC_CATCHER_CALLBACK_ERR:
            throw new RpcTransactionException($code, $this->catcher->getMessage());
        
        default:
            throw new RpcTransactionException($code, '未知错误');
    }
}
// 分布式事务安全验证结束

函数

  • getRpcTransID 获取当前事务ID(支持在事务发起端和远程接口)
  • inRpcTrans 检测是否在事务中
  • rpcTransCallback
  • hasRpcTransError 获取事务抛出的错误信息(支持在事务发起端和远程接口的try方法内)
  • getRpcTransSteps 获取事务流程数据(支持在事务发起端)

colornet/htcc 适用场景与选型建议

colornet/htcc 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 54 次下载、GitHub Stars 达 0, 最近一次更新时间为 2020 年 11 月 02 日, 在 PHP 生态内属于活跃度较高的组件。

它主要适用于以下技术方向: 「php」 「hyperf」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。

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

围绕 colornet/htcc 我们能提供哪些服务?
定制开发 / 二次开发

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

BUG 修复 & 性能优化

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

项目外包 & 长期维护

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

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

统计信息

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

GitHub 信息

  • Stars: 0
  • Watchers: 0
  • Forks: 1
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2020-11-02