完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
摘要: 虽然微服务现在如火如荼,但对其实践其实仍处于初级阶段。即使互联网巨头的实践也大多是试验层面,鲜有核心业务系统微服务化的案例。GTS是目前业界第一款,也是唯一的一款通用的解决微服务分布式事务问题的中间件,而且可以保证数据的强一致性。本文将对GTS做出深入解读。
微服务倡导将复杂的单体应用拆分为若干个功能简单的、松耦合的服务,这样可以降低开发难度、增强扩展性、便于敏捷开发。概念2012年提出迅速火遍全球,被越来越多的开发者推崇,很多互联网行业巨头、开源社区等都开始了微服务的讨论和实践。根据Netflix云架构总监Adrian Cockcrof,Hailo有160个不同服务构成,NetFlix有大约600个服务。国内方面,阿里巴巴、腾讯、360、京东、58等很多互联网公司都进行了微服务化改造。当前微服务的开发框架也有几十种之多,比较著名的有Dubbo、SpringCloud、thrift 、grpc等。1 分布式事务解决方案及其弊端虽然微服务现在如火如荼,但对其实践其实仍处于初级阶段。即使互联网巨头的实践也大多是试验层面,鲜有核心业务系统微服务化的案例。而对于很多中小型互联网公司,鉴于经验、技术实力等问题,微服务落地更加困难。世界著名的软件架构大师Chris Richardson在《Introduction to Microservices》一文中也直接了当的指出了微服务当前存在的问题: 对于第一和第三个问题,笔者认为随着RPC框架的成熟,已经逐渐得到解决。例如dubbo可以支持rmi、hessian、http、webservice、thrift、redis等多种通讯协议,springcloud可以非常好的支持restful调用。spring体系下应用的测试也变的越来越简单。对于第四个问题,随着docker、devops技术的发展以及各公有云paas平台自动化运维工具的推出,微服务的部署与运维会变得越来越容易。而对于Chris Richardson提到的第二个问题,现在还没有通用方案很好的解决微服务产生的事务问题。分布式事务已经成为微服务落地最大的阻碍,也是最具挑战性的一个技术难题。 为此,本文将深入和大家探讨微服务架构下,分布式事务的各种解决方案,并重点为大家解读阿里巴巴提出的分布式事务解决方案----GTS。该方案中提到的GTS是目前业界第一款,也是唯一的一款通用的解决微服务分布式事务问题的中间件,而且可以保证数据的强一致性。2 SOA分布式事务解决方案在微服务之前,信息系统中的服务大多基于SOA的理念设计(SOA与微服务的区别),服务相对比较重。对于服务调用产生的分布式事务问题,在SOA时代,就有一些解决方案。比较著名的有基于XA协议的方案、TCC方案、消息最终一致性方案。2.1基于XA协议的方案该方案最早由oracle提出用于解决跨数据访问的事务问题,是一种强一致性的解决方案,由事务协调器和本地资源管理器共同完成。事务协调器和资源管理器间通过XA协议进行通信。XA协议实现的原理入下图所示,共分为两个阶段,也就是我们常说的两阶段协议。 两阶段方案在解决数据库分布式事务问题方面应用非常广泛,oracle、Mysql等主流关系数据库均支持XA协议,而且ocenbase、DCDB等著名的分布式数据库也都基于两阶段协议。在解决服务事务问题上,其实 XA协议不是只能作用于单个服务内部的多资源场景,跨服务的多资源场景也是可以的,只不过需要额外的事务传递机制。但其都有致命的缺点,性能不理想。由于需要等到各分支事务都就绪后全局事务才开始提交,所以每个事务锁定数据的时间较长,XA方案因此很难满足高并发场景。而且在解决微服务问题时XA方案的性能问题将会被放大。因为应用在访问服务的调用方式、网络环境等要比访问数据库复杂的多。例如,应用和其访问的数据库通常在一个局域网中,而其通过rpc调用的服务则可能属于另一个网络或者在公网上,其时延更长、出故障的概率更高。这将导致数据锁定时间和系统并发度进一步降低。所以XA方案基本不适合解决微服务的事务问题。2.2TCC方案TCC方案应用是目前呼声最高,也是落地最多的一个方案。当前也有一些开源的TCC框架实现,如TCC-Transaction、ByteTCC。TCC方案其实是两阶段方案的一种改进,其将本地资源管理器的功能融入到了业务实现中。其将整个业务逻辑显示的分成了Try、Confirm、Cancel三部分。try部分完成业务的准备工作,confirm部分完成业务的提交,cancel部分完成事务的回滚。基本原理如下图所示。 事务开始时,业务应用会向事务协调器注册启动事务。之后业务应用会调用所有服务的try接口,相当于XA的第一阶段。如果有任何一个服务的try接口调用失败会向事务协调器发送事务回滚请求,否则发送事务提交请求。事务协调器收到事务回滚请求后会依次调用事务的confirm接口,否则调用cancel接口回滚,这相当于XA的第二阶段。如果第二阶段接口调用失败,会进行重试。TCC方案通过通过三个接口很好的规避了长时间数据加锁的问题,业务表在每个接口调用完毕即可释放,这很大程度上提高了业务的并发度,这也是TCC方案最大的优势。所以在SOA时期,TCC方案被很多金融、电商的业务系统大量使用。 当然TCC方案也有不足之处,集中表现在以下两个方面:
以下单业务为例进行说明,下单基本流程是先存储订单信息,然后扣相应商品的库存,两个操作必须在一个事务中。如下图,业务应用首先调用订单服务,订单存储成功后,订单服务会通过消息处理服务投递订单消息到MQ。库存服务从MQ收到消息后进行扣库存操作,如果执行成功会向消息处理服务发送通知。消息处理服务会实时监测订单消息是否超时,如果超时会重新投递到MQ中,以驱动库存服务进行扣库存操作。如果扣库存操作执行失败后,库存服务后续还会从MQ接收到相同的订单消息,需要多次重复执行,直到成功或者进行人工干预。库存服务需要实现幂等。 消息方案从本质上讲是将分布式事务转换为两个本地事务,然后依靠下游业务的重试机制达到最终一致性。相对TCC方案来讲,消息方案技术难度相对低,落地较容易,如果对一致性不敏感的应用也是一个不错的选择。美国著名电商e-bay以及国内的蘑菇街都做过尝试。消息一致性方案的不足之处是其对应用侵入性较高,应用需要基于消息接口进行改造,而且需要建设专门的消息系统,成本较高。3 GTS--微服务分布式事务解决方案GTS是一款分布式事务中间件,由阿里巴巴中间件部门研发,可以为微服务架构中的分布式事务提供一站式解决方案。GTS方案的基本思路是:将分布式事务与具体业务分离,在平台层面开发通用的事务中间件GTS,由事务中间件协调各服务的调用一致性,负责分布式事务的生命周期管理、服务调用失败的自动回滚。GTS方案有三方面的优势,首先它将微服务从分布式事务中解放出来,微服务的实现不需要再考虑反向接口、幂等、回滚策略等复杂问题,只需要业务自己的接口即可,大大降低了微服务开发的难度与工作量。将分布式事务从所谓的“贵族技术”变为大家都能使用的“平民技术 ”,有利于微服务的落地与推广。 其次,GTS对业务代码几乎没有侵入,只需要通过注解@TxcTransaction界定事务边界即可,微服务接入GTS的成本非常低。第三,性能方面GTS也非常优秀,是传统XA方案的8~10倍。3.1 基本原理GTS中间件主要包括客户端(GTS Client)、资源管理器(GTS RM)和事务协调器(GTS Server)三部分。GTS Client主要完成事务的发起与结束。GTS RM完成分支事务的开启、提交、回滚等操作。GTS Server主要负责分布式事务的整体推进,事务生命周期的管理。 GTS和微服务集成后的结构图如上图所示。GTS Client需要和业务应用集成部署,RM与微服务集成部署。当业务应用发起服务调用时,首先会通过GTS Client向TC注册新的全局事务。之后GTS Server会给业务应用返回全局唯一的事务编号xid。业务应用调用服务时会将xid传播到服务端。微服务在执行数据库操作时会通过GTS RM向GTS Server注册分支事务,并完成分支事务的提交。如果A、B、C三个服务均调用成功,GTS Client会通知GTS Server结束事务。假设C调用失败,GTS Client会要求GTS Server发起全局回滚。然后由各自的RM完成回滚工作。3.2 GTS的关键机制
公有云提供了比较丰富的与dubbo、SpringCloud等集成的样例,可以点击查看。
现在提供了sample-txc-simple和sample-txc-sample两个样例,sample-txc-simple是GTS的入门的基础样例,点击下载后,搭建好本地的数据库环境就可以直接运行样例。sample-txc-dubbo是GTS和dubbo框架集成的样例,也可以直接在本地机器运行。
@TxcTransaction(timeout = 1000 * 10)public void Bussiness(OrderServiceInterface os,StockServiceInterface ss){//获取xidString xid = TxcContext.getCurrentXid();//1:调用订单服务,创建订单//通过dubbo的隐形参数将txcid传到服务端RpcContext.getContext().setAttachment("xid",xid);int ret = os.setOrder(new Order(pid,num,new Date()));//调用订单服务//2:调用库存服务,扣库存RpcContext.getContext().setAttachment("xid",xid);} 2 服务端使用方式库存服务public int setStock(Stock sk) {//通过dubbo上下文获取xidString xid = RpcContext.getContext().getAttachment("xid");//将事务id绑定到服务端txc的上下文TxcContext.bind(xid,null);//执行扣库存操作ret = jdbcTemplate2.update("update stock set number = number -? where pid = ?",new Object[]{sk.getPnum(),sk.getPid()});return ret;} 3.7 GTS的应用情况GTS在满足事务ACID的前提下,普通配置的单服务器可以达到15000 TPS以上的超强性能(两个小时完成1亿多笔业务)。目前已经在淘宝、天猫、阿里影业、淘票票、阿里妈妈、1688等阿里各业务系统广泛使用,经受了16年和17年两年双十一海量请求的考验。某线上业务系统最高流量已达十万TPS(每秒钟10万笔事务)。GTS在阿里云及专有云上输出后,有很多用户通过GTS解决SpringCloud、Dubbo、Edas等微服务的分布式事务问题,包括国家电网、中国邮政、中国烟草、特步、浙江公安、德邦快递、一步共享科技等,涉及电力、物流、ETC、烟草、金融、零售、电商、共享出行等十几个行业,得到用户的一致认可。 上图是GTS与SpringCloud集成,应用于某共享出行系统。业务共享出行场景下,通过GTS支撑物联网系统、订单系统、支付系统、运维系统、分析系统等系各统应用事务一致性,保证海量订单和数千万流水的交易。原文链接 |
|
|
|
只有小组成员才能发言,加入小组>>
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-18 12:18 , Processed in 0.382310 second(s), Total 40, Slave 30 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号