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

网友投稿 978 2022-05-28

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

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

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

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

Try:尝试执行业务

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

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

Confirm:确认执行业务

真正执行业务

不作任何业务检查

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

Confirm操作满足幂等性

Cancel:取消执行业务

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

Cancel操作满足幂等性

与2PC协议比较

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

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

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

较高开发成本

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

    com.huawei.paas.cse     cse-handler-tcc

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

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

定义服务实现类

@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会被执行。

注意:

如果不使用标注的方式发布服务,那么需要在实现类上面打上@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文件中,相关配置项如下。

配置项

默认值

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

取值范围

是否必选

含义

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

微服务 ServiceComb 微服务引擎 CSE

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:SQL数据库基础
下一篇:velero入门
相关文章