华为云微服务引擎CSE事务方案一:TCC机制的数据最终一致性处理

举报
无微不至 发表于 2018/07/12 17:13:24 2018/07/12
【摘要】 在一个长事务中,一个由两台服务器一起参与的事务,服务器A发起事务,服务器B参与事务,B的事务需要人工参与,所以处理时间可能很长。如果按照ACID的原则,要保持事务的隔离性、一致性,A发起的事务中使用到的事务资源将会被锁定,不允许其他应用访问到事务过程中的中间结果,直到整个事务被提交或者回滚。这就造成事务A中的资源被长时间锁定,系统将不可用。

限时免费领取华为云微服务


TCC机制的数据最终一致性处理

概念阐述

在一个长事务中,一个由两台服务器一起参与的事务,服务器A发起事务,服务器B参与事务,B的事务需要人工参与,所以处理时间可能很长。如果按照ACID的原则,要保持事务的隔离性、一致性,A发起的事务中使用到的事务资源将会被锁定,不允许其他应用访问到事务过程中的中间结果,直到整个事务被提交或者回滚。这就造成事务A中的资源被长时间锁定,系统将不可用。

为了解决在事务运行过程中大颗粒度资源锁定的问题,业界提出一种新的事务模型,它是基于业务层面的事务定义。锁粒度完全由业务自己控制。它本质是一种补偿的思想。它把事务运行过程分成Try、Confirm/Cancel两个阶段。在每个阶段的逻辑由业务代码控制。这样就事务的锁粒度可以完全自由控制。业务可以在牺牲强隔离性的情况下,获取更高的性能。

场景描述

  • Try:尝试执行业务

    • 完成所有业务检查(一致性)

    • 预留必须业务资源(准隔离性)

  • Confirm:确认执行业务

    • 真正执行业务

    • 不作任何业务检查

    • 只是用Try阶段预留的业务资源

    • Confirm操作满足幂等性

  • Cancel:取消执行业务

    • 释放Try阶段预留的业务资源

    • Cancel操作满足幂等性

  • 与2PC协议比较

    • 位于业务服务层而非资源层

    • 没有单独的准备(Prepare)阶段,Try操作兼备资源操作与准备能力

    • Try操作可以灵活选择业务资源的锁定粒度

    • 较高开发成本

开发示例

  1. POM中引入TCC事务对应的依赖包:


    <dependency>
        <groupId>com.huawei.paas.cse</groupId>
        <artifactId>cse-handler-tcc</artifactId>
    </dependency>


  2. 在microservice.yaml中添加进处理链:


    cse:
      ......
      handler:
        chain:
          Provider:
            default: perf-stats,tcc-server
      ......


  3. 定义服务实现类


    @RpcSchema(schemaId = "helloworld")
    public class TccHelloworldImpl implements ITccHelloworld {
        private static final Logger LOGGER = LoggerFactory.getLogger(TccHelloServiceImpl.class);
        @Override
        @TccTransaction(confirmMethod = "confirm", cancelMethod = "cancel")
        public String sayHello(String name) {
            LOGGER.info("Try say hello from client, {}", name);
            return "Hello, " + name;
        }
        public String confirm(String name) {
            LOGGER.info("Confirm say hello from client, {}", name);
            return null;
        }
        public String cancel(String name) {
            LOGGER.info("Cancel say hello from client, {}", name);
            return null;
        }
    }

    在支持TCC事务的方法上打上@TccTransaction标注,并注明confirmMethod和cancelMethod方法。confirmMethod和cancelMethod的参数和返回值必须和服务提供函数相同。如果Try正常执行,confirm方法也会被执行。如果Try抛出异常,则cancel会被执行。

    icon-notice.gif 注意:


  • 如果不使用标注的方式发布服务,那么需要在实现类上面打上@Component标注。

  • TCC事务对业务逻辑定义需要有一定要求,TCC操作应该支持幂等性原则,否则容

    易产生过度补偿等问题。

  • TCC支持运行在微服务多实例中,其原理是将事务数据统一存储到数据库中,TCC组件提供统一的事务存储接口,以便开发对接不同的数据库,只需要继承实现com.huawei.paas.cse.tcc.repository.CachableTransactionRepository类即可完成多实例TCC支持;也可参考com.huawei.paas.cse.tcc.repository包中简单的数据库存储类实现,已简单实现了Jdbc/redis/ZooKeeper的对接。

  • yaml文件中bizkeeper和tcc-server配置先后顺序会引起前台仪表盘不同的计数方式。若将tcc-server配置在bizkeeper前,仪表盘中显示server端一次调用,反之仪表盘显示两次调用,因为bizkeeper的计数在tcc-sever的打点前则会有2次restful接口调用。

配置说明

TCC配置在microservice.yaml文件中,相关配置项如下。

表1 QPS流控配置项说明

配置项

默认值

取值范围

是否必选

含义

cse.tcc.transaction.repository

com.huawei.paas.cse.tcc.repository.FileSystemTransactionRepository

true/false

事务存储仓库

cse.tcc.transaction.repository.file.path

tcc

-

使用文件系统存储事务时,指定文件存储根路径,默认在当前目录的tcc文件夹下

cse.tcc.transaction.recover


true

true/false

是否启动恢复机制


立即体验华为微服务CSE:https://console.huaweicloud.com/cse/?region=cn-north-1#/cse/home


了解详情:https://www.huaweicloud.com/product/cse.html

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。