分布式事务 08 TCC框架示例——hmily

市面常见TCC框架

  • Seata :阿里云推出的组件,支持较多方案,主推AT(二阶段+分布式锁)
  • tcc-transaction:不和底层rpc耦合,使用dubbo,http,thrift,webservice都可
  • tx-lcn:支持常用的dubbo,springcloud框架,维护不频繁,热度有所下降
  • hmily:国内工程师开发,异步高性能TCC框架,适应国内环境
  • ByteTcc:国内开发,兼容JTA规范的TCC框架
  • EasyTransaction:柔性事务、TCC、SAGA、可靠消息等功能齐全,一站式解决

hmily框架

在Gitee上可以找到,demo位于hmily-demo模块下

hmily框架demo——订单扣减库存

  • 代码配置与流程
    先根据官方手册,拉取代码

hmily在代码中的体现

  1. 在账户服务AccountServiceImpl中,通过使用@HmilyTCC注解,将方法声明为TCC式分布式事务的方法
@Override
@HmilyTCC(confirmMethod = "confirm", cancelMethod = "cancel")
public boolean payment(final AccountDTO accountDTO) {
    LOGGER.info("============执行try付款接口===============");
    accountMapper.update(accountDTO);
    return Boolean.TRUE;
}

可以看到@HmilyTCC注解中有两个属性,confirmMethodcancelMethod。这两个属性需要填写对应的方法名称。

顾名思义,这两个方法就是confirm阶段与cancel阶段处理事务的方法,连同将方法体本身作为try阶段,共同组成了TCC分布式事务的三要素。

对应着可以看下confirm方法与cancel方法

/**
 * Confirm boolean.
 *
 * @param accountDTO the account dto
 * @return the boolean
 */
public boolean confirm(final AccountDTO accountDTO) {
    LOGGER.info("============执行confirm 付款接口===============");
    return accountMapper.confirm(accountDTO) > 0;
}


/**
 * Cancel boolean.
 *
 * @param accountDTO the account dto
 * @return the boolean
 */
public boolean cancel(final AccountDTO accountDTO) {
    LOGGER.info("============执行cancel 付款接口===============");
    return accountMapper.cancel(accountDTO) > 0;
}

此时也能看到TCC模型的些许弊端:一个接口需求,需要写至少三个方法来保证TCC三要素,并且这三个方法需要开发者自己思考业务进行正向操作与反向操作的双向开发。

  1. 关键注解

@HmilyTCC与@Hmily

RPC上面的Hmily注解的作用只是用于连接前后两个微服务的,使它们处于同一个分布式事务之下。
比如Feign调用的库存服务:

@FeignClient(value = "inventory-service")
public interface InventoryClient {
    
    /**
     * 库存扣减.
     *
     * @param inventoryDTO 实体对象
     * @return true 成功
     */
    @RequestMapping("/inventory-service/inventory/decrease")
    @Hmily
    Boolean decrease(@RequestBody InventoryDTO inventoryDTO);
    
    /**
     * 模拟库存扣减异常.
     *
     * @param inventoryDTO 实体对象
     * @return true 成功
     */
    @Hmily
    @RequestMapping("/inventory-service/inventory/mockWithTryException")
    Boolean mockWithTryException(@RequestBody InventoryDTO inventoryDTO);
}

各个微服务内部的@HmilyTCC才是真正用于处理分布式事务的(执行try,confirm,canel,维护事务日志等),如上文说的三段式方法。

  • 流程分析

分布式事务java代码怎么写 分布式事务hmily_分布式事务java代码怎么写