分布式事务实现方案阿里巴巴fescar、华为servicecomb-pack对比分析

概述mysql

因为微服务架构大行其道,分布式通讯几何级增长,必然带来一致性问题,也就是说,之前你遇到不一致的几率多是100年1次,如今多是1年1次,甚至1天1次。微服务架构的前期,大多数开发者只关注拆分,选择性忽略一致性、性能、可用性、工具链等问题,致使架构寸步难行,在这些问题当中,一致性是最容易被忽略的。固然,绝大多数场景并不须要那么高的一致性,能够采用失败重试的策略简单处理。 从目前业界的状况来看,主要有以下几种实现方式:git

XA(2PC)github

失败重试sql

可靠事件数据库

Sagaapache

TCC架构

实际上不少方案都要结合业务去作,可是事务保证自己是一个通用的技术,工程师更但愿抽象出来,经过简单的配置、注解就能搞定,而且不会大幅下降性能。框架

下面就给你们介绍两个开源的关于分布式事务的明日之星框架。分布式

对比
出身
Fescar是阿里巴巴开源的分布式事务中间件,基于其内部的TXC和GTS的技术积累。虽然此框架很是活跃,可是19年刚刚开源,目前0.3版本,若是用于生产环境风险较大。微服务

servicecomb-pack出自华为微服务框架servicecomb,servicecomb在Apache已经毕业了,可是一直比较“低调”。知名数据库中间Sharding-Sphere采用的就是servicecomb-pack提供的saga方案。

实现原理

fescar实际上本质就是将一个分布式事务转化为多个单库事务。

没错,这就是Saga的思想,全部的正向操做,都保留逆向操做。一旦要回滚,只须要执行逆向操做就能够了。

 

如图所示,这种方案和基于业务实现的原理比较像,就是在业务数据库中额外增长一张事件表,这个事件表就是关键所在,在更新正常业务数据库的同时,在一个单库事务内(同一个数据库链接)同步更新事件表,这样来保证不丢数据。咱们能够回顾一下一致性的要求,“要么同时成功,要么同时失败。”单库事务就能够保证。

 

如图所示,business要去调用Storage和order服务,如何保证事务呢?bussiness是事务的发起者,也叫TM,Order、Storage是事务的执行者,是被调用的服务,也叫RM,TC负责总体协调,能够生成全局事务ID,全部被调用的服务就是经过这个全局的事务ID串联起来的,另外,TC承担分布式锁的能力,这个分布式锁主要是为了解决写隔离,拿到锁才有写的权利,固然TC必须是高可用的。Storage和Order在进行业务操做的时候除了正常存储业务数据,还要在同一个事务内实现事件表的更新,一旦出现回滚的要求,须要根据事件表生成逆向操做的SQL,而且执行回滚。

servicecomb-pack和fescar同样,一样是saga的思想,全部的正向操做,都保留逆向操做。一旦要回滚,只须要执行逆向操做就能够了。可是,除此以外,servicecomb-pack也支持TCC。

如图所示,Omega做为一个客户端,拦截全部的事务操做,事务开始向Alpha记录开始记录,事务结束向Alpha记录事务结束记录,一旦出现问题,直接在Alpha事件表中生成逆向操做,你应该已经看出来了,和fescar不一样的是,事件表中的数据存储在全局协调者(alpha)这一侧。

两种作法各有优劣吧,存在业务侧其实是有侵入的,不是绝对意义上的无侵入,虽然单库事务性能不错,可是事件表的全部操做都会影响正常业务,没法作到更好的隔离性。存在协调者一侧相对来讲隔离性更好一些,可是这里会有几率产生不一致,例如,实际上业务操做已经完成了,数据库更新成功了,可是写事件日志可能会失败,这时候协调者会认为业务操做也失败了。

稳定性
servicecomb-pack略胜一筹。更早的项目。

隔离性
fescar略胜一筹。虽然并不完美,可是已有解决方案。fescar写隔离经过TC提供的分布式锁来实现,读隔离经过select for update实现,固然,servicecomb-pack一样能够经过select for update实现读隔离。

复杂度
servicecomb-pack略胜一筹。角色少,思路简单。业务侧,两个框架均可以经过简单的注解实现。

文档
fescar略胜一筹。

性能
没有实际测试,从原理上来说,相差无几。

支持的数据库
fescar目前只支持mysql,servicecomb-pack的方案不区分数据库。

更详细的内容能够参考官方文档。

总结
虽然两个框架的目标都是让业务开发人员更简单,不用关心分布式事务的问题,可是在我看来,若是要使用,仍是要搞清楚原理,除非对此问题很是敏感,不然,应该谨慎使用,能不用最好不用。 两个框架都在快速发展中,从实现思想上来说很是类似,都是很好的解决方案,将来的状况主要看投入程度。

 

声明:因为两个框架都在前期快速发展的阶段,案例和资料都不多,本人没法保证全部观点的正确性,若有谬误,请不吝赐教。

 

参考:

https://github.com/apache/servicecomb-pack/blob/master/docs/design_zh.md

https://github.com/alibaba/fescar

相关文章
相关标签/搜索