zoukankan      html  css  js  c++  java
  • 分布式事务08 TCC框架示例——hmily

    分布式事务 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,维护事务日志等),如上文说的三段式方法。

    • 流程分析

  • 相关阅读:
    在django中使用orm来操作MySQL数据库的建表,增删改
    TCP中的粘包问题,以及用TCP和UDP实现多次聊天
    网络编程概念
    面向对向---封装
    xlrd模块读取Excel表中的数据
    curl和wget的区别和使用
    WebSocke
    HTTP状态码(响应码)
    IO模型
    Redis为什么使用单进程单线程方式
  • 原文地址:https://www.cnblogs.com/pipicai96/p/13747056.html
Copyright © 2011-2022 走看看