阿里GTS微服务架构下分布式事务解决方案.docx

上传人:b****4 文档编号:3488628 上传时间:2022-11-23 格式:DOCX 页数:13 大小:247.75KB
下载 相关 举报
阿里GTS微服务架构下分布式事务解决方案.docx_第1页
第1页 / 共13页
阿里GTS微服务架构下分布式事务解决方案.docx_第2页
第2页 / 共13页
阿里GTS微服务架构下分布式事务解决方案.docx_第3页
第3页 / 共13页
阿里GTS微服务架构下分布式事务解决方案.docx_第4页
第4页 / 共13页
阿里GTS微服务架构下分布式事务解决方案.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

阿里GTS微服务架构下分布式事务解决方案.docx

《阿里GTS微服务架构下分布式事务解决方案.docx》由会员分享,可在线阅读,更多相关《阿里GTS微服务架构下分布式事务解决方案.docx(13页珍藏版)》请在冰豆网上搜索。

阿里GTS微服务架构下分布式事务解决方案.docx

阿里GTS微服务架构下分布式事务解决方案

 

    

   

微服务架构下分布式事务解决方案——阿里GTS

    

 

 

 

 

 

 

   

   

   

 

 

 

姜宇,阿里巴巴高级技术专家,主要参与中间件平台。

微服务的发展

微服务倡导将复杂的单体应用拆分为若干个功能简单、松耦合的服务,这样可以降低开发难度、增强扩展性、便于敏捷开发。

当前被越来越多的开发者推崇,很多互联网行业巨头、开源社区等都开始了微服务的讨论和实践。

Hailo有160个不同服务构成,NetFlix有大约600个服务。

国内方面,阿里巴巴、腾讯、360、京东、58同城等很多互联网公司都进行了微服务化实践。

当前微服务的开发框架也非常多,比较著名的有Dubbo、SpringCloud、thrift、grpc等。

##2微服务落地存在的问题虽然微服务现在如火如荼,但对其实践其实仍处于探索阶段。

很多中小型互联网公司,鉴于经验、技术实力等问题,微服务落地比较困难。

如著名架构师ChrisRichardson所言,目前存在的主要困难有如下几方面:

1)单体应用拆分为分布式系统后,进程间的通讯机制和故障处理措施变的更加复杂。

2)系统微服务化后,一个看似简单的功能,内部可能需要调用多个服务并操作多个数据库实现,服务调用的分布式事务问题变的非常突出。

3)微服务数量众多,其测试、部署、监控等都变的更加困难。

随着RPC框架的成熟,第一个问题已经逐渐得到解决。

例如dubbo可以支持多种通讯协议,springcloud可以非常好的支持restful调用。

对于第三个问题,随着docker、devops技术的发展以及各公有云paas平台自动化运维工具的推出,微服务的测试、部署与运维会变得越来越容易。

而对于第二个问题,现在还没有通用方案很好的解决微服务产生的事务问题。

分布式事务已经成为微服务落地最大的阻碍,也是最具挑战性的一个技术难题。

为此,本文将深入和大家探讨微服务架构下,分布式事务的各种解决方案,并重点为大家解读阿里巴巴提出的分布式事务解决方案----GTS。

该方案中提到的GTS是全新一代解决微服务问题的分布式事务互联网中间件。

 传统分布式事务解决方案

基于XA协议的两阶段提交方案

交易中间件与数据库通过XA接口规范,使用两阶段提交来完成一个全局事务,XA规范的基础是两阶段提交协议。

第一阶段是表决阶段,所有参与者都将本事务能否成功的信息反馈发给协调者;第二阶段是执行阶段,协调者根据所有参与者的反馈,通知所有参与者,步调一致地在所有分支上提交或者回滚。

两阶段提交方案应用非常广泛,几乎所有商业OLTP数据库都支持XA协议。

但是两阶段提交方案锁定资源时间长,对性能影响很大,基本不适合解决微服务事务问题。

TCC方案

TCC方案在电商、金融领域落地较多。

TCC方案其实是两阶段提交的一种改进。

其将整个业务逻辑的每个分支显式的分成了Try、Confirm、Cancel三个操作。

Try部分完成业务的准备工作,confirm部分完成业务的提交,cancel部分完成事务的回滚。

基本原理如下图所示。

事务开始时,业务应用会向事务协调器注册启动事务。

之后业务应用会调用所有服务的try接口,完成一阶段准备。

之后事务协调器会根据try接口返回情况,决定调用confirm接口或者cancel接口。

如果接口调用失败,会进行重试。

TCC方案让应用自己定义数据库操作的粒度,使得降低锁冲突、提高吞吐量成为可能。

当然TCC方案也有不足之处,集中表现在以下两个方面:

•          对应用的侵入性强。

业务逻辑的每个分支都需要实现try、confirm、cancel三个操作,应用侵入性较强,改造成本高。

•          实现难度较大。

需要按照网络状态、系统故障等不同的失败原因实现不同的回滚策略。

为了满足一致性的要求,confirm和cancel接口必须实现幂等。

上述原因导致TCC方案大多被研发实力较强、有迫切需求的大公司所采用。

微服务倡导服务的轻量化、易部署,而TCC方案中很多事务的处理逻辑需要应用自己编码实现,复杂且开发量大。

基于消息的最终一致性方案

消息一致性方案是通过消息中间件保证上、下游应用数据操作的一致性。

基本思路是将本地操作和发送消息放在一个事务中,保证本地操作和消息发送要么两者都成功或者都失败。

下游应用向消息系统订阅该消息,收到消息后执行相应操作。

消息方案从本质上讲是将分布式事务转换为两个本地事务,然后依靠下游业务的重试机制达到最终一致性。

基于消息的最终一致性方案对应用侵入性也很高,应用需要进行大量业务改造,成本较高。

GTS--分布式事务解决方案

GTS是一款分布式事务中间件,由阿里巴巴中间件部门研发,可以为微服务架构中的分布式事务提供一站式解决方案。

更多GTS资料请访问研发团队微博。

GTS的核心优势

•          性能超强

GTS通过大量创新,解决了事务ACID特性与高性能、高可用、低侵入不可兼得的问题。

单事务分支的平均响应时间在2ms左右,3台服务器组成的集群可以支撑3万TPS以上的分布式事务请求。

•          应用侵入性极低

GTS对业务低侵入,业务代码最少只需要添加一行注解(@TxcTransaction)声明事务即可。

业务与事务分离,将微服务从事务中解放出来,微服务关注于业务本身,不再需要考虑反向接口、幂等、回滚策略等复杂问题,极大降低了微服务开发的难度与工作量。

•          完整解决方案

GTS支持多种主流的服务框架,包括EDAS,Dubbo,SpringCloud等。

有些情况下,应用需要调用第三方系统的接口,而第三方系统没有接入GTS。

此时需要用到GTS的MT模式。

GTS的MT模式可以等价于TCC模式,用户可以根据自身业务需求自定义每个事务阶段的具体行为。

MT模式提供了更多的灵活性,可能性,以达到特殊场景下的自定义优化及特殊功能的实现。

•          容错能力强

GTS解决了XA事务协调器单点问题,典型配置是三台服务器组成的事务协调器集群,实现服务高可用,可以保证异常情况(比如网络断开、服务器宕机、硬盘损坏不可恢复等)下的数据严格一致。

在要求更高可用性的场景,比如电商业务双11大促,常用配置是六台服务器组成的主、备集群(各三台)。

当主集群有服务器不可用,自动切换到备集群提供服务。

 GTS的应用场景

GTS可应用在涉及服务调用的多个领域,包括但不限于金融支付、电信、电子商务、快递物流、广告营销、社交、即时通信、手游、视频、物联网、车联网等,详细介绍可以阅读《GTS--阿里巴巴分布式事务全新解决方案》一文。

对于GTS已经支持的数据源(MySQL,DRDS,RDS,PetaData,Oracle,Oceanbase等)可以采用AT模式(自动模式,加个注解界定事务范围即可),对于目前不支持的数据源(HBase,Redis,DB2等)可以采用MT模式(手动模式,等价于TCC,需要手工实现接口)。

具体使用方式参考官网样例。

GTS与微服务的集成

GTS包括客户端(GTSClient)、资源管理器(GTSRM)和事务协调器(GTSServer)三个部分。

GTSClient主要用来界定事务边界,完成事务的发起与结束。

GTSRM完成事务分支的创建、提交、回滚等操作。

GTSServer主要负责分布式事务的整体推进,事务生命周期的管理。

GTS和微服务集成的结构图如下所示,GTSClient需要和业务应用集成部署,RM与微服务集成部署。

GTS的输出形式

GTS目前有三种输出形式:

公有云输出、公网输出、专有云输出。

公有云输出

这种输出形式面向阿里云用户。

如果用户的业务系统已经部署到阿里云上,可以申请开通公有云GTS。

开通后业务应用即可通过GTS保证服务调用的一致性。

这种使用场景下,业务系统和GTS间的网络环境比较理想,达到很好性能。

公网输出

这种输出形式面向于非阿里云的用户,使用更加方便、灵活,业务系统只要能连接互联网即可享受GTS提供的云服务(与公有云输出的差别在于客户端部署于用户本地,而不在云上)。

在正常网络环境下,以包含两个本地事务的全局事务为例,事务完成时间在20ms左右,50个并发就可以轻松实现1000TPS以上分布式事务,对绝大多数业务来说性能是足够的。

在公网环境,网络闪断很难完全避免,这种情况下GTS仍能保证服务调用的数据一致性。

具体使用样例使用参见4.7节GTS的工程样例。

专有云输出

这种形式主要面向于已建设了自己专有云平台的大用户,GTS可以直接部署到用户的专有云上,为专有云提供分布式事务服务。

目前已经有10多个特大型企业的专有云使用GTS解决分布式事务难题,性能与稳定性经过了用户的严格检测。

GTS的使用方式

GTS使用请参考官网。

GTS对应用的侵入性非常低,使用也很简单。

下面以订单存储应用为例说明。

订单业务应用通过调用订单服务和库存服务完成订单业务,服务开发框架为Dubbo。

####4.5.1订单业务应用在业务函数外围使用@TxcTransaction注解即可开启分布式事务。

Dubbo应用通过隐藏参数将GTS的事务xid传播到服务端。

@TxcTransaction(timeout=1000*10)

publicvoidBussiness(OrderServiceorderService,StockServicestockService,StringuserId){

   //获取事务上下文

   Stringxid=TxcContext.getCurrentXid();

   //通过RpcContext将xid传到一个服务端

   RpcContext.getContext().setAttachment("xid",xid);

   

   //执行自己的业务逻辑

   intproductId=newRandom().nextInt(100);

   intproductNum=newRandom().nextInt(100);

   OrderDOorderDO=newOrderDO(userId,productId,productNum,newTimestamp(newDate().getTime()));

   orderService.createOrder(orderDO);

   

   //通过RpcContext将xid传到另一个服务端

   RpcContext.getContext().setAttachment("xid",xid);

   stockService.updateStock(orderDO);

}

服务提供者

更新库存方法

publicintupdateStock(OrderDOorderDO){

   //获取全局事务ID,并绑定到上下文

   Stringxid=RpcContext.getContext().getAttachment("xid");

   TxcContext.bind(xid,null);

   //执行自己的业务逻辑

   intret=jdbcTemplate.update("updatestocksetamount=amount-?

whereproduct_id=?

",newObject[]{orderDO.getNumber(),orderDO.getProductId()});

   TxcContext.unbind();

   returnret;

}

GTS的应用情况

GTS目前已经在淘宝、天猫、阿里影业、淘票票、阿里妈妈、1688等阿里各业务系统广泛使用,经受了16年和17年两年双十一海量请求的考验。

某线上业务系统最高流量已达十万TPS(每秒钟10万笔事务)。

GTS在公有云和专有云输出后,已经有了100多个线上用户,很多用户通过GTS解决SpringCloud、Dubbo、Edas等服务框架的分布式事务问题。

业务领域涉及电力、物流、ETC、烟草、金融、零售、电商、共享出行等十几个行业,得到用户的一致好评。

 

上图是GTS与SpringCloud集成,应用于某共享出行系统。

业务共享出行场景下,通过GTS支撑物联网系统、订单系统、支付系统、运维系统、分析系统等系各统应用的数据一致性,保证海量订单和数千万流水的交易。

GTS的工程样例

GTS的公有云样例可参考阿里云网站。

在公网环境下提供sample-txc-simple和sample-txc-dubbo两个样例工程。

sample-txc-simple样例

1样例业务逻辑

该样例是GTS的入门sample,案例的业务逻辑是从A账户转账给B账户,其中A和B分别位于两个MySQL数据库中,使用GTS事务保证A和B账户钱的总数始终不变。

#####4.7.1.2样例搭建方法1)准备数据库环境

安装MySQL,创建两个数据库db1和db2。

在db1和db2中分别创建txc_undo_log表(SQL脚本见4.7.3)。

在db1库中创建user_money_a表,在db2库中创建user_money_b表。

2.        下载样例

将sample-txc-simple文件下载到本地,样例中已经包含了GTS的SDK。

3.        修改配置

打开sample-txc-simple/src/main/resources目录下的txc-client-context.xml,将数据源的url、username、password修改为实际值。

4.        运行样例

在sample-txc-simple目录下执行build.sh编译本工程。

编译完成后执行run.sh。

sample-txc-dubbo样例

1.样例业务逻辑

本案例模拟了用户下订单、减库存的业务逻辑。

客户端(Client)通过调用订单服务(OrderService)创建订单,之后通过调用库存服务(StockService)扣库存。

其中订单服务读写订单数据库,库存服务读写库存数据库。

由GTS保证跨服务事务的一致性。

 准备数据库环境

安装MySQL,创建两个数据库db1和db2。

在db1和db2中分别创建txc_undo_log表。

在db1库中创建orders表,在db2库中创建stock表。

2.下载样例

将样例文件sample-txc-dubbo下载到本地机器,样例中已经包含了GTS的SDK。

3.修改配置

打开sample-txc-dubbo/src/main/resources目录,将dubbo-order-service.xml、dubbo-stock-service.xml两个文件中数据源的url、username、password修改为实际值。

4.运行样例

a. 编译程序

在工程根目录执行build.sh命令,编译工程。

编译后会在sample-txc-dubbo/client/bin目录下生成order_run.sh、stock_run.sh、client_run.sh三个运行脚本对应订单服务、库存服务以及客户端。

b.        运行程序

在根目录执行run.sh,该脚本会依次启动order_run.sh(订单服务)、stock_run.sh(库存服务)和client_run.sh(客户端程序)。

其他说明

样例使用Multicast注册中心的声明方式。

如果本机使用无线网络,dubbo服务在绑定地址时有可能获取ipv6地址,可以通过jvm启动参数禁用。

方法是配置jvm启动参数-D.preferIPv4Stack=true。

建表txc_undo_logCREATETABLEtxc_undo_log(

idbigint(20)NOTNULLAUTO_INCREMENTCOMMENT'主键',

gmt_createdatetimeNOTNULLCOMMENT'创建时间',

gmt_modifieddatetimeNOTNULLCOMMENT'修改时间',

xidvarchar(100)NOTNULLCOMMENT'全局事务ID',

branch_idbigint(20)NOTNULLCOMMENT'分支事务ID',

rollback_infolongblobNOTNULLCOMMENT'LOG',

statusint(11)NOTNULLCOMMENT'状态',

servervarchar(32)NOTNULLCOMMENT'分支所在DBIP',

PRIMARYKEY(id),

KEYunionkey(xid,branch_id)

)ENGINE=InnoDBAUTO_INCREMENT=211225994DEFAULTCHARSET=utf8COMMENT='事务日志表';

4.7.3.2建表user_money_a

CREATETABLEuser_money_a(

idint(11)NOTNULLAUTO_INCREMENT,

moneyint(11)DEFAULTNULL,

PRIMARYKEY(id)

)ENGINE=InnoDBAUTO_INCREMENT=2DEFAULTCHARSET=utf8;

建表user_money_b

CREATETABLEuser_money_b(

idint(11)NOTNULLAUTO_INCREMENT,

moneyint(11)DEFAULTNULL,

PRIMARYKEY(id)

)ENGINE=InnoDBAUTO_INCREMENT=2DEFAULTCHARSET=utf8;

建表orders

CREATETABLEorders(

idbigint(20)NOTNULLAUTO_INCREMENT,

user_idvarchar(255)NOTNULL,

product_idint(11)NOTNULL,

numberint(11)NOTNULL,

gmt_createtimestampNOTNULL,

PRIMARYKEY(id)

)ENGINE=MyISAMAUTO_INCREMENT=351DEFAULTCHARSET=utf8

建表stock

CREATETABLEstock(

product_idint(11)NOTNULL,

pricefloatNOTNULL,

amountint(11)NOTNULL,

PRIMARYKEY(product_id)

)ENGINE=InnoDBDEFAULTCHARSET=utf8

测试数据

测试环境:

笔记本电脑(sample程序和测试用的MySQL),家庭16M宽带。

测试数据:

10个线程并发,事务完成时间平均25毫秒,每秒完成400左右事务。

总结

GTS已经在阿里内部广泛使用,经过了双十一流量高峰的考验。

内部成熟后,在专有云和公有云服务了很多用户,很多用户一天事务量在千万/亿级别,解决了业务服务化改造后的分布式事务棘手技术难题。

在整个世界范围内,既满足事务ACID特性,又具备高性能、高可用、业务侵入性低的分布式事务中间件在GTS前是不存在的。

让我们一起体验GTS带来的巨大变革吧!

 

 技术琐话 

 

以分布式设计、架构、体系思想为基础,兼论研发相关的点点滴滴,不限于代码、质量体系和研发管理。

本号作者:

右军,有8年电信业务经验和8年互联网金融业务经验。

除原创外,作者也转一些BAT级的技术干货。

 

 

 

 

 

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1